将多个列收集到逗号,分隔列表中

时间:2017-08-07 12:28:54

标签: r tidyr

我想根据这个模式转换R中的数据框:

enter image description here

请注意,之前热编码的属性Att_1是作为逗号分隔的列表收集在IDy的单个单元格中。

我如何在R中执行此操作(例如使用tidyr函数)?

test <- data.frame(ID = c("IDx", "IDy"), Att_1_1 = c(0,0), Att_1_2 = c(1,1), Att_1_3 = c(0, 1), Att_2 = c(1,1), Att_3 = c(1,0))

2 个答案:

答案 0 :(得分:3)

当OP请求tidyr个功能时,我们gather将数据集filter转换为“长”&#39;格式,paste行&#39; val&#39;是1,按&#39; ID&#39;,summarise&#39;键&#39;分组用于创建left_join d列&#39; Att_1&#39;和library(tidyverse) test %>% gather(key, val, Att_1_1:Att_1_3) %>% filter(val==1) %>% group_by(ID) %>% summarise(Att_1 = toString(key)) %>% left_join(df1[-(2:4)], ., by = "ID") %>% select(ID, Att_1, Att_2, Att_3) # ID Att_1 Att_2 Att_3 #1 IDx Att_1_2 1 1 #2 IDy Att_1_2, Att_1_3 1 0 由&#39; ID&#39;与原始数据集

<p class="l1">   (a)<tab/>blah blah</p>
<p class="l1">   (b)<tab/>blah blah</p>
<p class="l1">   (c)<tab/>blah blah</p>
<p class="l2">   (i)<tab/>blah blah</p>
<p class="l2">   (ii)<tab/>blah blah</p>
<p class="l2">   (iii)<tab/>blah blah</p>
<p class="l2">   (iv)<tab/>blah blah</p>

答案 1 :(得分:3)

在基础R中,您可以执行以下操作。

# set up new dataframe
res <- test[-(2:4)]

# add new varible
res$Att_1 <- apply(test[, 2:4], 1, function(x) c(names(test)[2:4][as.logical(x)]))

这里,apply循环遍历子集data.frame的行,并使用逻辑子集返回行单元格的值等于1的名称的向量。

返回

 res
  ID  Att_2 Att_3            Att_1
1 IDx     1     1          Att_1_2
2 IDy     1     0 Att_1_2, Att_1_3

请注意

res[["Att_1"]] <- ...

也可以。