我想根据这个模式转换R中的数据框:
请注意,之前热编码的属性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))
答案 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"]] <- ...
也可以。