嗨我知道有类似的问题,但解决方案似乎没有解决我的问题,所以我想知道是否有人可以提供帮助。
我有一个大型数据框,里面有一个这样的列:
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”。知道如何将它们分开以便以后我可以单独引用这些列?谢谢!
答案 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,',')