将行转置为具有多个类别的列 dplyr
Transpose rows to columns with multiple categories dplyr
我想使用 tidyr
的传播函数将具有多个行和多个 id 的数据框转换为具有一行的 df,其中我们有用于所有 id 组合的指示列和类别。如果 dplyr
和 tidyr
不是最合适的,开放给其他类似传播的功能。
在下面的脚本中,我只能指定 1 列作为值对。我想将 cat1 和 cat2 作为值列。另外,我希望字段名称为 "sentid1_cat1, sentid1_cat2" 等
test.df <- data.frame(sentid = 1:3,
cat1 = c(1,0,0),
cat2 = c(0,1,0))
test.df %>%
spread(key = sentid, value = cat1, sep = '_')
编辑
期望的输出:
output.df <- data.frame(sentid1_cat1 = 1,
sentid1_cat2 = 0,
sentid2_cat1 = 0,
sentid2_cat2 = 1,
sentid3_cat1 = 0,
sentid3_cat2 = 0)
dplyr
+tidyr
的解决方案:
library(dplyr)
library(tidyr)
test.df %>%
gather(variable, value, -sentid) %>%
unite(variable, sentid, variable) %>%
mutate(variable = paste0("sentid", variable)) %>%
spread(variable, value)
结果:
sentid1_cat1 sentid1_cat2 sentid2_cat1 sentid2_cat2 sentid3_cat1 sentid3_cat2
1 1 0 0 1 0 0
我想使用 tidyr
的传播函数将具有多个行和多个 id 的数据框转换为具有一行的 df,其中我们有用于所有 id 组合的指示列和类别。如果 dplyr
和 tidyr
不是最合适的,开放给其他类似传播的功能。
在下面的脚本中,我只能指定 1 列作为值对。我想将 cat1 和 cat2 作为值列。另外,我希望字段名称为 "sentid1_cat1, sentid1_cat2" 等
test.df <- data.frame(sentid = 1:3,
cat1 = c(1,0,0),
cat2 = c(0,1,0))
test.df %>%
spread(key = sentid, value = cat1, sep = '_')
编辑
期望的输出:
output.df <- data.frame(sentid1_cat1 = 1,
sentid1_cat2 = 0,
sentid2_cat1 = 0,
sentid2_cat2 = 1,
sentid3_cat1 = 0,
sentid3_cat2 = 0)
dplyr
+tidyr
的解决方案:
library(dplyr)
library(tidyr)
test.df %>%
gather(variable, value, -sentid) %>%
unite(variable, sentid, variable) %>%
mutate(variable = paste0("sentid", variable)) %>%
spread(variable, value)
结果:
sentid1_cat1 sentid1_cat2 sentid2_cat1 sentid2_cat2 sentid3_cat1 sentid3_cat2
1 1 0 0 1 0 0