데이터 프레임의 구분 기호에서 열 분할
이 질문에 이미 답변이 있습니다.
- 데이터 프레임 문자열 열을 여러 열로 분할 14 답변
구분 기호를 기반으로 데이터 프레임에서 하나의 열을 두 개로 나누고 싶습니다. 예를 들면
a|b
b|c
될
a b
b c
데이터 프레임 내에서.
감사!
@Taesung Shin이 맞습니다.하지만 data.frame
. 모호함을 피하기 위해 "x | y"줄을 추가했습니다.
df <- data.frame(ID=11:13, FOO=c('a|b','b|c','x|y'))
foo <- data.frame(do.call('rbind', strsplit(as.character(df$FOO),'|',fixed=TRUE)))
또는 기존 data.frame의 열을 바꾸려는 경우 :
within(df, FOO<-data.frame(do.call('rbind', strsplit(as.character(FOO), '|', fixed=TRUE))))
다음을 생성합니다.
ID FOO.X1 FOO.X2
1 11 a b
2 12 b c
3 13 x y
새로 인기있는 tidyr
패키지는 separate
. 정규 표현식을 사용하므로 이스케이프해야합니다.|
df <- data.frame(ID=11:13, FOO=c('a|b', 'b|c', 'x|y'))
separate(data = df, col = FOO, into = c("left", "right"), sep = "\\|")
ID left right
1 11 a b
2 12 b c
3 13 x y
이 경우 기본값은 작동하기에 충분히 스마트합니다 (분리 할 영숫자가 아닌 문자를 찾습니다).
separate(data = df, col = FOO, into = c("left", "right"))
Hadley는 reshape
함수를 사용하여 패키지의 데이터 프레임 내에서이 작업을 수행하는 매우 우아한 솔루션을 가지고 있습니다 colsplit
.
require(reshape)
> df <- data.frame(ID=11:13, FOO=c('a|b','b|c','x|y'))
> df
ID FOO
1 11 a|b
2 12 b|c
3 13 x|y
> df = transform(df, FOO = colsplit(FOO, split = "\\|", names = c('a', 'b')))
> df
ID FOO.a FOO.b
1 11 a b
2 12 b c
3 13 x y
이 질문 은 최근 SO에 대한 질문에 링크되어 있습니다.
뻔뻔한 대답의 플러그 : cSplit
내 "splitstackshape"패키지에서 사용 :
df <- data.frame(ID=11:13, FOO=c('a|b','b|c','x|y'))
library(splitstackshape)
cSplit(df, "FOO", "|")
# ID FOO_1 FOO_2
# 1 11 a b
# 2 12 b c
# 3 13 x y
이 특정 함수는 각 열에 다른 구분 기호가있는 경우에도 여러 열 분할을 처리합니다.
df <- data.frame(ID=11:13,
FOO=c('a|b','b|c','x|y'),
BAR = c("A*B", "B*C", "C*D"))
cSplit(df, c("FOO", "BAR"), c("|", "*"))
# ID FOO_1 FOO_2 BAR_1 BAR_2
# 1 11 a b A B
# 2 12 b c B C
# 3 13 x y C D
기본적으로 A base R 접근 방식은 다음과 같습니다.read.table(text = some_character_vector, sep = some_sep)
출력을 사용하고 원본에 바인딩 하기위한 멋진 편의 래퍼입니다 data.frame
. 즉, 또 다른
df <- data.frame(ID=11:13, FOO=c('a|b','b|c','x|y'))
cbind(df, read.table(text = as.character(df$FOO), sep = "|"))
ID FOO V1 V2
1 11 a|b a b
2 12 b|c b c
3 13 x|y x y
strsplit(c('a|b','b|c'),'|',fixed=TRUE)
@Ramnath와 @Tommy의 답변을 결합하면 하나 이상의 열에 대해 기본 R에서 작동하는 접근 방식을 찾을 수 있습니다.
기본 사용법 :
> df = data.frame(
+ id=1:3, foo=c('a|b','b|c','c|d'),
+ bar=c('p|q', 'r|s', 's|t'), stringsAsFactors=F)
> transform(df, test=do.call(rbind, strsplit(foo, '|', fixed=TRUE)), stringsAsFactors=F)
id foo bar test.1 test.2
1 1 a|b p|q a b
2 2 b|c r|s b c
3 3 c|d s|t c d
여러 열 :
> transform(df, lapply(list(foo,bar),
+ function(x)do.call(rbind, strsplit(x, '|', fixed=TRUE))), stringsAsFactors=F)
id foo bar X1 X2 X1.1 X2.1
1 1 a|b p|q a b p q
2 2 b|c r|s b c r s
3 3 c|d s|t c d s t
여러 분할 열의 더 나은 이름 지정 :
> transform(df, lapply({l<-list(foo,bar);names(l)=c('foo','bar');l},
+ function(x)do.call(rbind, strsplit(x, '|', fixed=TRUE))), stringsAsFactors=F)
id foo bar foo.1 foo.2 bar.1 bar.2
1 1 a|b p|q a b p q
2 2 b|c r|s b c r s
3 3 c|d s|t c d s t
참고URL : https://stackoverflow.com/questions/7069076/split-column-at-delimiter-in-data-frame
'developer tip' 카테고리의 다른 글
R data.frame에서 행을 가져 오는 방법 (0) | 2020.08.27 |
---|---|
Tomcat 시작 로그-심각 : 오류 filterStart 스택 추적을 얻는 방법? (0) | 2020.08.26 |
완료 작업 버튼이있는 여러 줄 EditText (0) | 2020.08.26 |
코드가 단위 테스트의 일부로 실행 중인지 확인 (0) | 2020.08.26 |
사용 가능한 공유 옵션이있는 기본 iOS 6 공유 작업 시트를 표시하는 방법은 무엇입니까? (0) | 2020.08.26 |