R 如何创建一个新的数据框架,将原始数据用分隔符分隔;每个类别有不同的计数?

R 如何创建一个新的数据框架,将原始数据用分隔符分隔;每个类别有不同的计数?,r,dataframe,R,Dataframe,我有一张表格,格式如下 df1 <- data.frame (A=c("aaa", "bbb", "ccc", "ddd"), B=c("111; 222", "333", "444; 555; 666; 777", "888; 999")) A B 1 aaa 111; 222 2 bbb 333 3 ccc 444; 555; 666; 777 4 ddd

我有一张表格,格式如下

df1 <- data.frame (A=c("aaa", "bbb", "ccc", "ddd"),
                   B=c("111; 222", "333", "444; 555; 666; 777", "888; 999"))

    A                  B
1 aaa           111; 222
2 bbb                333
3 ccc 444; 555; 666; 777
4 ddd           888; 999

在前面的堆栈溢出问题中,我发现了一个很好的解决方案,可以将类似的列表转换为数据帧。然而,对于我来说,从一个包含多个条目的数据帧转换它是很困难的。我怎样才能做到这一点呢?

与我在回答你上一个问题时的第一步大致相同:

library(reshape)
x <- melt((strsplit(as.character(df1$B), "; ")))
x <- data.frame("A"=df1[x$L1,1],"B"=x$value)
库(重塑)

x这是一个简单的基本R解决方案(解释如下):

代码在做什么?第1行:

spl <- with(df1, strsplit(as.character(B), split = "; ", fixed = TRUE))
下一行只计算列表的每个组件中有多少元素
spl

lens <- sapply(spl, length)
解决方案的最后一行将前两个步骤的输出插入到新的数据帧中。诀窍是重复
df1$A的每个元素
镜头
次数;为此,我们使用
rep()
函数。我们还需要将列表
spl
展开为一个向量,我们使用
unlist()


out在这种情况下
fixed=TRUE
strsplit的参数
加速执行。就像Brandon的回答:使用
fixed=TRUE
strsplit的参数
加速计算。@Marek感谢这个指针,以前没有注意到这一点。为了完整起见,我将把它编辑成我的答案。@Brandon你知道他们怎么说“老狗和新把戏”吗?适合我穿的T恤!;-)复制粘贴上述代码会产生:
strsplit中的错误(B,split=“;”,fixed=TRUE):非字符参数
。但是,将B包装成.character(B)可以工作。(R版本3.1.0(2014-04-10)-“春舞”)谢谢@PatrickT+1。自2011年以来,R可能发生了变化——正如您在3.0补丁中所说的那样。我将编辑答案以包含信息。
R> out
    A   B
1 aaa 111
2 aaa 222
3 bbb 333
4 ccc 444
5 ccc 555
6 ccc 666
7 ccc 777
8 ddd 888
9 ddd 999
spl <- with(df1, strsplit(as.character(B), split = "; ", fixed = TRUE))
R> spl
[[1]]
[1] "111" "222"

[[2]]
[1] "333"

[[3]]
[1] "444" "555" "666" "777"

[[4]]
[1] "888" "999"
lens <- sapply(spl, length)
R> lens
[1] 2 1 4 2
out <- with(df1, data.frame(A = rep(A, lens), B = unlist(spl)))