首页 > 解决方案 > 对列值进行分组并避免 R 中的 N/a

问题描述

我有以下数据集

Date     Value   Gen
16  Mar   100    Gen1
16  Mar   9      Gen2
12  Mar   15     Gen1
12  Mar   18     Gen2

我曾尝试使用 dcast 和按功能分组,但我认为这不能满足我的需要。

我正在寻找的结果是:

Date1     Gen1  Gen2      
12 Mar    100   15              
16 Mar    9     18             

注意:日期值组合在一起,每个 Gen 值成为一列。数值如上表所示。应该没有 N/a,因为每个数据点都是可用的)。

我尝试过分组:代码:

library(dplyr)
aa %>% group_by(Date1, Value) %>%
mutate(id= paste("new_col_",row_number())) %>% 
ungroup() %>%
spread(id, Value)

结果:

Date1  Gen1  Gen2  `new_col_ 1`
<fct>  <chr> <chr> <fct>           
12_Mar Gen1  NA    100         
12_Mar NA    Gen2    NA    Gen4  15          
8_Mar  NA    Gen2  NA    NA    9           
8_Mar  NA    NA    Gen3  NA    15    

我尝试过 dcast ,它给了我类似的结果。

example <- dcast(df,Value + Date1 ~ Gen)

Value  Date1    Gen1   Gen2
100    16 Mar   Gen1   <NA>
15     12 Mar   Gen1   <NA>
18     12 Mar   <NA>   Gen2
9      16 Mar   <NA>   Gen2

任何帮助表示赞赏。

标签: r

解决方案


我们可以用spread

library(tidyr)
spread(aa, Gen, Value)
#     Date Gen1 Gen2
#1 12  Mar   15   18
#2 16  Mar  100    9

或使用dcast

library(data.table)
dcast(setDT(aa), Date ~ Gen, value.var = 'Value')

数据

aa <- structure(list(Date = c("16  Mar", "16  Mar", "12  Mar", "12  Mar"
), Value = c(100L, 9L, 15L, 18L), Gen = c("Gen1", "Gen2", "Gen1", 
"Gen2")), class = "data.frame", row.names = c(NA, -4L))

推荐阅读