programing

데이터 프레임의 구분 기호에서 열 분할

abcjava 2023. 7. 10. 21:57
반응형

데이터 프레임의 구분 기호에서 열 분할

구분 기호를 기준으로 데이터 프레임 내에서 하나의 열을 두 개로 나누고 싶습니다.예를들면,

a|b
b|c

되기 위해

a    b
b    c

데이터 프레임 내에서.

감사합니다!

@신태성 말이 맞아요, 하지만 마법을 좀 더 부려주면 돼요.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내 "스택 모양" 패키지에서:

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 접근 방식은 다음과 같습니다.

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

반응형