在R中的数据框中为列中的唯一元素创建其他行

时间:2016-07-29 23:35:27

标签: r dataframe split unique

我在R。

中有这个数据框
df <- read.table(text="
nr  first  second
n1  a;a;b  1;1;7
n2  c;c    3;3
n3  d;e    4;4", header=T, stringsAsFactors=FALSE)

并且,我希望将其转换为这样的数据框。

nr first second
n1 a     1
n1 b     7
n2 c     3
n3 d     4
n3 e     4

对于每一行,我只想在第一个&#39;中保留唯一元素。对于每个独特的元素,我想要一个单独的行。

此外,列&#39>首先&#39;和第二个&#39;有联系。例如,&#39; b&#39;在&#39; a; a; b&#39;对应于7 in 1; 1; 7; 7&#39;。我只想把元素保留在第二个&#39;对应于&#39; first&#39;中的元素。

2 个答案:

答案 0 :(得分:3)

来自separate_rows()包的

tidyr是您正在寻找的功能:

library(tidyr)
unique(separate_rows(df, sep = ";", first:second))

#   nr first second
# 1 n1     a      1
# 3 n1     b      7
# 4 n2     c      3
# 6 n3     d      4
# 7 n3     e      4

答案 1 :(得分:2)

我们可以使用cSplit

library(splitstackshape)
unique(cSplit(df, c("first", "second"), ";", "long"))
#    nr first second
#1: n1     a      1
#2: n1     b      7
#3: n2     c      3
#4: n3     d      4
#5: n3     e      4

或者不使用任何外部包,我们遍历第二和第三列,由分隔符(strsplit(x, ";")),stack分割为data.frame,然后cbind list个元素,获取unique行并将列名更改为原始数据集的名称。

lst <- lapply(df[2:3], function(x) stack(setNames(strsplit(x, ";"), df[,1])))
setNames(unique(cbind(lst[[1]][2:1], lst[[2]][1])), names(df))
#  nr first second
#1 n1     a      1
#3 n1     b      7
#4 n2     c      3
#6 n3     d      4
#7 n3     e      4