在r

时间:2015-11-30 08:11:34

标签: r

嗨我知道有类似的问题,但解决方案似乎没有解决我的问题,所以我想知道是否有人可以提供帮助。

我有一个大型数据框,里面有一个这样的列:

result
A, B-C
A, C-D
E, F-G
...

我设法使用以下方法将列拆分为三个:

df$new_result <- str_match(df$result, "^(.*),(.*)-(.*)$")[,-1]

现在,数据框的一部分如下:

result    new_result.1    new_result.2    new_result.3
A, B-C        A               B                C
A, C-D        A               C                D
E, F-G        E               F                G
...    

然而,当我试图打电话时:

df$new_result.1

R给了我一个错误,指出找不到“new_result.1”。

我尝试过以下但没有一个有效。

with(df, colsplit(df$result, pattern = "^(.*),(.*)-(.*)$", names = c('a', 'b', 'c')))

OR

names(df)[names(df) == 'new_result.1'] <- 'a'

OR

setNames(df, c(...,'a','b','c',...))

我认为问题是在数据框中找不到“new_result.1”,“new_result.2”,“new_result.3”,而是将它们一起称为“new_result”。知道如何将它们分开以便以后我可以单独引用这些列?谢谢!

2 个答案:

答案 0 :(得分:3)

按照您的方法,当我们查看&#39; str(df)&#39;我们得到这个:

> str(df)
'data.frame':   3 obs. of  2 variables:
 $ result    : chr  "A, B-C" "A, C-D" "E, F-G"
 $ new_result: chr [1:3, 1:3] "A" "A" "E" " B" ...

这并不奇怪,因为str_match会返回一个矩阵。

解决此问题的方法如下:

创建&#39; splitted&#39;具有相关列名的数据框

splitted <- data.frame(str_match(df$result, "^(.*),(.*)-(.*)$")[,-1],
                       stringsAsFactors=F)
colnames(splitted) <- paste0("new_result.",1:ncol(splitted))

并且把所有东西放在一起

df <- cbind(df,splitted)
> str(df)
'data.frame':   3 obs. of  4 variables:
 $ result      : chr  "A, B-C" "A, C-D" "E, F-G"
 $ new_result.1: chr  "A" "A" "E"
 $ new_result.2: chr  " B" " C" " F"
 $ new_result.3: chr  "C" "D" "G"

答案 1 :(得分:0)

请尝试

install.packages("do")
library(do)
df2=Replace(data = df,pattern = '-:,')
col_split(df2$result,',')