두 줄을 어떻게 연결할 수 있습니까?


375

두 값을 어떻게 연결 (병합, 결합) 할 수 있습니까? 예를 들어

tmp = cbind("GAD", "AB")
tmp
#      [,1]  [,2]
# [1,] "GAD" "AB"

내 목표는 "tmp"의 두 값을 하나의 문자열로 연결하는 것입니다.

tmp_new = "GAD,AB"

어떤 기능이 나를 위해 이것을 할 수 있습니까?


@RichardScriven의 답변 메모와 같이 문자열이 벡터 인 경우 대부분의 답변이 중단됩니다.
smci

@ smci 내가 게시 한 작은 답변은 어떻습니까? 그것을 개선하기위한 제안?
joel.wilson

답변:


505
paste()

갈 길입니다. 이전 포스터에서 지적했듯이 붙여 넣기는 두 가지 작업을 수행 할 수 있습니다.

값을 하나의 "문자열"로 연결

> paste("Hello", "world", sep=" ")
[1] "Hello world"

여기서 인수 sep는 문자 벡터를 연결하거나 축소하기 위해 인수 사이에 사용될 문자를 지정합니다.

> x <- c("Hello", "World")
> x
[1] "Hello" "World"
> paste(x, collapse="--")
[1] "Hello--World"

여기서 인수 collapse는 축소 할 벡터 요소 사이에 사용할 문자를 지정합니다.

두 가지를 결합 할 수도 있습니다.

> paste(x, "and some more", sep="|-|", collapse="--")
[1] "Hello|-|and some more--World|-|and some more"

도움이 되었기를 바랍니다.


9
길이가 다른 문자열과 벡터 또는 벡터를 혼합하는 것은 paste()내가 좋아하는 것에서 약간 유연 합니다. 예를 들어 paste(c('a','b'),'blah', c(1,2,3))결과는 "a blah 1" "b blah 2" "a blah 3"입니다. 기본적으로 전달되는 가장 긴 벡터와 동일한 길이의 문자열 벡터를 만들고 다른 벡터 / 문자열을 같은 길이로 반복합니다. 우연한 행동을위한 충분한 공간이 있습니다.
naught101

1
사실이지만 질문을 해결하는 다른 방법을 제공 할 수 있습니까?
Rainer

1
아니오-귀하의 답변은 정확합니다 (대부분의 다른 답변은 같은 것을 말합니다). 붙여 넣기의 동작이 유연성에있어 특이하다는 점에 주목했습니다.
naught101

2
@ naught101 나는 R의 표준에 의해 비정상적으로 간주하지 않을 것입니다. 벡터 재활용은 R 함수의 공통 속성입니다. 'blah'는 길이가 1 인 벡터입니다. 재활용 속성을 사용하면 쉽게 paste0("blah", 1:3)얻을 수있는 작업을 수행 할 수 "blah1" "blah2" "blah3"있습니다.
Dason

5
예, 나는 paste : P뿐만 아니라 R에 대해 불평해야합니다. 실제로 R에 걸쳐 일관성 data.frame()이 없습니다. 벡터가 서로의 배수가 아닌 경우에는 할 수 없습니다. matrix()경고를 내뱉지 만 array()그렇지 않습니다. 성가신 종류. 실제로, 그들은 어떤 옵션이 설정되지 않는 한 모두 경고를
내뱉어야합니다

85

help.search() 편리한 기능입니다. 예 :

> help.search("concatenate")

당신을 이끌 것 paste()입니다.


42

첫 번째 비 paste()응답에 대해서는 stringr::str_c()(그리고 toString()아래) 를 볼 수 있습니다 . 이 질문만큼 오래되지 않았으므로 그것이 존재한다는 것을 언급하는 것이 유용하다고 생각합니다.

보시다시피 사용이 매우 간단합니다.

tmp <- cbind("GAD", "AB")
library(stringr)
str_c(tmp, collapse = ",")
# [1] "GAD,AB"

문서 파일 설명에서이 문제에 잘 맞습니다.

str_c의 작동 방식을 이해하려면 문자열 매트릭스를 작성한다고 상상해야합니다. 각 입력 인수는 열을 형성하며 일반적인 재생 규칙을 사용하여 가장 긴 인수의 길이로 확장됩니다. sep 문자열은 각 열 사이에 삽입됩니다. collapse가 NULL이면 각 행이 단일 문자열로 축소됩니다. NULL이 아닌 경우 해당 문자열이 각 행의 끝에 삽입되고 전체 행렬이 단일 문자열로 축소됩니다.

2016 년 4 월 13 일 추가 : 원하는 출력 (추가 공간)과 정확히 동일하지는 않지만 아무도 언급하지 않았습니다. toString()버전 기본적 paste()으로 collapse = ", "당신이 할 수 있도록, 하드 코딩

toString(tmp)
# [1] "GAD, AB"

3
Heh, 이것은 tmp가 단순한 값이 아니라 벡터라는 사실을 다루는 유일한 대답입니다 paste. 벡터를하지 않습니다. 다른 옵션은 do.call(paste, as.list(tmp))입니다.
naught101

35

다른 사람들이 지적했듯이 paste()갈 길입니다. 그러나 paste(str1, str2, str3, sep='')기본이 아닌 구분 기호를 원할 때마다 입력하는 것이 번거로울 수 있습니다.

인생을 훨씬 간단하게 만드는 래퍼 함수를 ​​매우 쉽게 만들 수 있습니다. 예를 들어 구분자가없는 문자열을 연결하는 경우 다음을 수행 할 수 있습니다.

p <- function(..., sep='') {
    paste(..., sep=sep, collapse=sep)
}

또는 벡터에서 문자열을 자주 결합하려는 경우 (예 implode(): PHP) :

implode <- function(..., sep='') {
     paste(..., collapse=sep)
}

이렇게 할 수 있습니다 :

p('a', 'b', 'c')
#[1] "abc"
vec <- c('a', 'b', 'c')
implode(vec)
#[1] "abc"
implode(vec, sep=', ')
#[1] "a, b, c"

또한 내장과가 paste0있으며 my와 동일한 기능을 수행 implode하지만 사용자 정의 구분 기호를 허용하지 않습니다. 보다 약간 더 효율적 paste()입니다.



28

또는 목표가 파일 또는 stdout으로 직접 출력하는 경우 다음을 사용할 수 있습니다 cat.

cat(s1, s2, sep=", ")

4
그렇다면 이미 paste십여 개의 paste답변 이있을 때 4 년 후에 답변을 게시하는 요점 은 무엇입니까?
David Arenburg

4
당시 나는 여러 답변을 요약하는 것이 도움이되었다는 것을 알게되었습니다. 목표는 투표를 수집하는 것이 아니라 다른 사람들이 많은 솔루션을 필터링 할 수 있도록 돕는 것입니다. 종종 내가 찾고있는 것입니다.
Megatron

22

또 다른 방법:

sprintf("%s you can add other static strings here %s",string1,string2)

때로는 기능보다 유용 paste()합니다. %s주관적인 문자열이 포함될 장소를 나타냅니다.

경로를 만들려고 할 때 유용합니다.

sprintf("/%s", paste("this", "is", "a", "path", sep="/"))

산출

/this/is/a/path

R을 다루는 C 프로그래머에게 sprintf는 친숙하고 "두 문자열을 연결"하는데 유용합니다
subsci

훨씬 더 나은 imho. paste문자열에 무언가를 추가하려는 경우 충분히 유연하지 않습니다.
표시 이름

20

당신은 당신 자신의 연산자를 만들 수 있습니다 :

'%&%' <- function(x, y)paste0(x,y)
"new" %&% "operator"
[1] newoperator`

'and'( &) 연산자를 다시 정의 할 수도 있습니다 .

'&' <- function(x, y)paste0(x,y)
"dirty" & "trick"
"dirtytrick"

기본 구문을 어지럽히는 것은 추악하지만 paste()/paste0()자신의 코드로만 작업 하는 경우 논리 & and연산자 *를 논리 '및 &'대신 논리 값으로 대체 하고 곱할 수 있습니다 (거의 항상)


@ 리차드 Scriven에 내가 이해가 안 mayby하지만 비교, 간단 보인다 : paste0(as.matrix(iris[1:4]) , as.matrix(iris[1:4]))as.matrix(iris[1:4]) %&% as.matrix(iris[1:4])
Qbik

아주 아주 좋은! &는 많은 언어에서 연결의 표준입니다. 실제로 R에는 기본적으로 있어야한다고 생각합니다. 강력 추천합니다
Serhii

14

작성한 매트릭스 tmp가 주어지면 다음을 수행하십시오.

paste(tmp[1,], collapse = ",")

나는 당신이 cbind를 사용하여 행렬을 만드는 이유가 있다고 가정합니다.

tmp <- "GAD,AB"

3

문자열이 열이고 결과가 새로운 열이어야하는 경우를 고려하십시오.

df <- data.frame(a = letters[1:5], b = LETTERS[1:5], c = 1:5)

df$new_col <- do.call(paste, c(df[c("a", "b")], sep = ", ")) 
df
#  a b c new_col
#1 a A 1    a, A
#2 b B 2    b, B
#3 c C 3    c, C
#4 d D 4    d, D
#5 e E 5    e, E

선택적으로 [c("a", "b")]모든 열을 붙여 넣어야하는 경우 하위 설정을 건너 뜁니다 .

# you can also try str_c from stringr package as mentioned by other users too!
do.call(str_c, c(df[c("a", "b")], sep = ", ")) 

그래도 stringi, stringr라이브러리는 더 빠릅니다.
smci

2

붙여 넣기가 아닌 다른 답변 :

x <- capture.output(cat(data, sep = ","))
x
[1] "GAD,AB"

어디

 data <- c("GAD", "AB")

2

glue의 일부로 개발 된 새로운 기능, 데이터 클래스 및 패키지는 다양한 tidyverse확장 기능을 갖추고 있습니다. 붙여 넣기, sprintf 및 이전의 다른 답변의 기능을 결합합니다.

tmp <- tibble::tibble(firststring = "GAD", secondstring = "AB")
(tmp_new <- glue::glue_data(tmp, "{firststring},{secondstring}"))
#> GAD,AB

reprex 패키지 (v0.2.1)로 2019-03-06에 작성

그렇습니다.이 질문의 간단한 예에서는 과잉이지만 많은 상황에서 강력합니다. ( https://glue.tidyverse.org/ 참조 )

빠른 예는 비교 pastewith아래. glue코드를 입력하는 것이 좀 더 쉽게했다 읽을 조금 더 쉽게 보인다.

tmp <- tibble::tibble(firststring = c("GAD", "GAD2", "GAD3"), secondstring = c("AB1", "AB2", "AB3"))
(tmp_new <- glue::glue_data(tmp, "{firststring} and {secondstring} went to the park for a walk. {firststring} forgot his keys."))
#> GAD and AB1 went to the park for a walk. GAD forgot his keys.
#> GAD2 and AB2 went to the park for a walk. GAD2 forgot his keys.
#> GAD3 and AB3 went to the park for a walk. GAD3 forgot his keys.
(with(tmp, paste(firststring, "and", secondstring, "went to the park for a walk.", firststring, "forgot his keys.")))
#> [1] "GAD and AB1 went to the park for a walk. GAD forgot his keys."  
#> [2] "GAD2 and AB2 went to the park for a walk. GAD2 forgot his keys."
#> [3] "GAD3 and AB3 went to the park for a walk. GAD3 forgot his keys."

reprex 패키지 (v0.2.1)로 2019-03-06에 작성

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.