R 将相同的值分散到多个列中

R 将相同的值分散到多个列中,r,dataframe,dplyr,spread,R,Dataframe,Dplyr,Spread,这是我的出发点 test <- data.frame(ident = c(1,2,3,4,5), cult1 = c("CER", "CER", "CER", "INF", "INF"), cult2 = c("GEX", "GEX", "GEX", &

这是我的出发点

test <- data.frame(ident = c(1,2,3,4,5), 
                   cult1 = c("CER", "CER", "CER", "INF", "INF"), 
                   cult2 = c("GEX", "GEX", "GEX", "GEX", "GEX"), 
                   cult3 = c(NA, "ORG", "ORG", NA, NA), 
                   prod = c(11050,2134,0,26250,2124),
                   value = c(19785,34132,9207,6987,4455),
                   weight = c(0,0,56,13,556))
test%
排列(键=分类温度,value=“prod”)
测试%变异(分类温度=paste0(“V”,文化1))%>%
排列(键=分类温度,value=“value”)
测试%变异(分类温度=paste0(“W”,文化1))%>%
排列(键=分类温度,值=“重量”)
试验%变异(分类温度=paste0(“P”),试验2))%>%
排列(键=分类温度,value=“prod2”)
测试%变异(分类温度=paste0(“V_u2;”,cult2))%>%
排列(键=分类温度,value=“value2”)
测试%变异(分类温度=paste0(“W”,cult2))%>%
排列(键=分类温度,值=“权重2”)
测试%变异(分类温度=paste0(“P_”,3))%>%
排列(键=分类温度,value=“prod3”)
测试变异百分比(分类温度=paste0(“V_u3))%>%
排列(键=分类温度,value=“value3”)
测试%变异(分类温度=paste0(“W_u”,cult3))%>%
排列(键=分类温度,值=“权重3”)
#删除NA命名列
测试%select(-u以“NA”结尾)
有没有更有效的方法? 我没有pivot_功能,因为我运行的是旧的R版本

预期结果:

  ident cult1 cult2 cult3 P_CER P_INF V_CER V_INF W_CER W_INF P_GEX V_GEX W_GEX P_ORG V_ORG W_ORG
1     1   CER   GEX  <NA> 11050    NA 19785    NA     0    NA 11050 19785     0    NA    NA    NA
2     2   CER   GEX   ORG  2134    NA 34132    NA     0    NA  2134 34132     0  2134 34132     0
3     3   CER   GEX   ORG     0    NA  9207    NA    56    NA     0  9207    56     0  9207    56
4     4   INF   GEX  <NA>    NA 26250    NA  6987    NA    13 26250  6987    13    NA    NA    NA
5     5   INF   GEX  <NA>    NA  2124    NA  4455    NA   556  2124  4455   556    NA    NA    NA
ident cult1 cult2 cult3 P_CER P_INF V_CER V_INF W_CER W_INF P_GEX V_GEX W_GEX P_ORG V_ORG W_ORG
1 CER GEX 11050 NA 19785 NA 0 NA 11050 19785 0 NA NA NA
2 CER GEX组织2134 NA 34132 NA 0 NA 2134 34132 0 2134 34132 0
3 CER GEX组织0 NA 9207 NA 56 NA 0 9207 56 0 9207 56
4 INF GEX NA 26250 NA 6987 NA 13 26250 6987 13 NA NA
5 INF GEX NA 2124 NA 4455 NA 556 2124 4455 556 NA NA NA

我不确定是否可以称之为更高效,但至少它是一个代码块:

test2 <- test %>% 
  gather(cult1:cult3, key = "key", value = "cult") %>% 
  mutate(prod_cult = paste0("P_",cult),
         value_cult = paste0("V_",cult),
         weight_cult = paste0("W_",cult)) %>% 
  spread(key = key, value = cult) %>% 
  spread(key = prod_cult, value = prod) %>% 
  spread(key = value_cult, value = value) %>%
  spread(key = weight_cult, value = weight) %>%
  group_by(ident) %>% 
  summarise_all(~first(na.omit(.))) %>%
  select(-ends_with("NA"))
test2%
聚集(cult1:cult3,key=“key”,value=“cult”)%>%
突变(prod_cult=paste0(“P_”),cult,
value_cult=paste0(“V_u”,cult),
重量曲线=粘贴0(“W曲线”,曲线))%>%
排列(键=键,值=邪教)%>%
价差(键=产品,值=产品)%>%
排列(键=值,值=值)%>%
排列(键=重量,值=重量)%>%
分组人(识别号)%>%
总结所有内容(~首先(不适用)(省略)()%>%
选择(-u以“NA”结尾)

Thx,我认为它更有效。另外,我在聚集中添加了na.rm=T,因此我不需要删除创建的“na”列
test2 <- test %>% 
  gather(cult1:cult3, key = "key", value = "cult") %>% 
  mutate(prod_cult = paste0("P_",cult),
         value_cult = paste0("V_",cult),
         weight_cult = paste0("W_",cult)) %>% 
  spread(key = key, value = cult) %>% 
  spread(key = prod_cult, value = prod) %>% 
  spread(key = value_cult, value = value) %>%
  spread(key = weight_cult, value = weight) %>%
  group_by(ident) %>% 
  summarise_all(~first(na.omit(.))) %>%
  select(-ends_with("NA"))