두 값을 어떻게 연결 (병합, 결합) 할 수 있습니까? 예를 들어
tmp = cbind("GAD", "AB")
tmp
# [,1] [,2]
# [1,] "GAD" "AB"
내 목표는 "tmp"의 두 값을 하나의 문자열로 연결하는 것입니다.
tmp_new = "GAD,AB"
어떤 기능이 나를 위해 이것을 할 수 있습니까?
두 값을 어떻게 연결 (병합, 결합) 할 수 있습니까? 예를 들어
tmp = cbind("GAD", "AB")
tmp
# [,1] [,2]
# [1,] "GAD" "AB"
내 목표는 "tmp"의 두 값을 하나의 문자열로 연결하는 것입니다.
tmp_new = "GAD,AB"
어떤 기능이 나를 위해 이것을 할 수 있습니까?
답변:
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"
도움이 되었기를 바랍니다.
paste()
내가 좋아하는 것에서 약간 유연 합니다. 예를 들어 paste(c('a','b'),'blah', c(1,2,3))
결과는 "a blah 1" "b blah 2" "a blah 3"
입니다. 기본적으로 전달되는 가장 긴 벡터와 동일한 길이의 문자열 벡터를 만들고 다른 벡터 / 문자열을 같은 길이로 반복합니다. 우연한 행동을위한 충분한 공간이 있습니다.
paste0("blah", 1:3)
얻을 수있는 작업을 수행 할 수 "blah1" "blah2" "blah3"
있습니다.
data.frame()
이 없습니다. 벡터가 서로의 배수가 아닌 경우에는 할 수 없습니다. matrix()
경고를 내뱉지 만 array()
그렇지 않습니다. 성가신 종류. 실제로, 그들은 어떤 옵션이 설정되지 않는 한 모두 경고를
첫 번째 비 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"
paste
. 벡터를하지 않습니다. 다른 옵션은 do.call(paste, as.list(tmp))
입니다.
다른 사람들이 지적했듯이 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()
입니다.
> tmp = paste("GAD", "AB", sep = ",")
> tmp
[1] "GAD,AB"
나는 R 연결 문자열 을 검색하여 Google에서 이것을 찾았습니다 : http://stat.ethz.ch/R-manual/R-patched/library/base/html/paste.html
또는 목표가 파일 또는 stdout으로 직접 출력하는 경우 다음을 사용할 수 있습니다 cat
.
cat(s1, s2, sep=", ")
paste
십여 개의 paste
답변 이있을 때 4 년 후에 답변을 게시하는 요점 은 무엇입니까?
또 다른 방법:
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
paste
문자열에 무언가를 추가하려는 경우 충분히 유연하지 않습니다.
당신은 당신 자신의 연산자를 만들 수 있습니다 :
'%&%' <- function(x, y)paste0(x,y)
"new" %&% "operator"
[1] newoperator`
'and'( &
) 연산자를 다시 정의 할 수도 있습니다 .
'&' <- function(x, y)paste0(x,y)
"dirty" & "trick"
"dirtytrick"
기본 구문을 어지럽히는 것은 추악하지만 paste()/paste0()
자신의 코드로만 작업 하는 경우 논리 & and
연산자 *
를 논리 '및 &'대신 논리 값으로 대체 하고 곱할 수 있습니다 (거의 항상)
paste0(as.matrix(iris[1:4]) , as.matrix(iris[1:4]))
와as.matrix(iris[1:4]) %&% as.matrix(iris[1:4])
문자열이 열이고 결과가 새로운 열이어야하는 경우를 고려하십시오.
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
라이브러리는 더 빠릅니다.
붙여 넣기가 아닌 다른 답변 :
x <- capture.output(cat(data, sep = ","))
x
[1] "GAD,AB"
어디
data <- c("GAD", "AB")
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/ 참조 )
빠른 예는 비교 paste
와 with
아래. 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에 작성