我在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;中的元素。
答案 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