将列值分组并避免R中的N / a

时间:2019-08-26 14:30:52

标签: r

我有以下数据集

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

我尝试过使用dcast和group by函数,但是我认为这不能满足我的需求。

我正在寻找的结果是:

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

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

我们可以使用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))