创建新列以根据其他列的组合显示重复值

时间:2019-06-10 13:49:15

标签: r

我正在尝试编写一个R脚本,该脚本将基于位于多个不同列中的值和一个ID字段创建新列,然后使用基于value字段的重复值填充这些列。起始数据框如下所示:

    df
   ID   row1   row2
1   1      x   <NA>
2   1   <NA>   <NA>
3   1   <NA>      y
4   2   <NA>      x
5   2      y   <NA>
6   3   <NA>      x
7   3   <NA>   <NA>
8   3   <NA>   <NA>
9   3      x   <NA>
10  4   <NA>      x

这是我希望创建的:

df
   ID   row1   row2   x1   y1   x2   y2   x3 y3   x4 
1   1      x   <NA>    x <NA> <NA> <NA> <NA> NA <NA> 
2   1   <NA>   <NA>    x <NA> <NA> <NA> <NA> NA <NA> 
3   1   <NA>      y    x    y <NA> <NA> <NA> NA <NA> 
4   2   <NA>      x <NA> <NA>    x <NA> <NA> NA <NA> 
5   2      y   <NA> <NA> <NA>    x    y <NA> NA <NA> 
6   3   <NA>      x <NA> <NA> <NA> <NA>    x NA <NA> 
7   3   <NA>   <NA> <NA> <NA> <NA> <NA>    x NA <NA> 
8   3   <NA>   <NA> <NA> <NA> <NA> <NA>    x NA <NA> 
9   3      x   <NA> <NA> <NA> <NA> <NA>    x NA <NA> 
10  4   <NA>      x <NA> <NA> <NA> <NA> <NA> NA    x 
> 

我已经能够基于存在的每个value-ID组合自动创建空列。没有将占用它们的任何值的值对组合不需要创建列,在本示例中为列假设y4。我试图在for循环中使用嵌套的if语句来自动执行该操作,但是我无法在必要时重复这些值。关于如何在ID字段与列匹配时如何从上方获取数据框副本值的任何想法?

1 个答案:

答案 0 :(得分:0)

这是一种将产生预期输出的方法,其区别在于它仅显示数据集中实际存在的那些值-ID组合(例如,离开y3列,它们全部为NA)< / p>

df1 = data.frame(ID = df$ID, val = coalesce(df$row1,df$row2))

df1 %>% unite(comb, ID, val) %>% 
        mutate(val = df1$val, rn = row_number()) %>% 
        spread(comb,val) %>% mutate(ID = df$ID, row1 = df$row1, row2 = df$row2) %>% 
        group_by(ID) %>% fill(everything()) %>% 
        select(-rn) %>% select(-contains("NA"))

A grouped_df: 10 × 9
1_x 1_y 2_x 2_y 3_x 4_x ID  row1  row2
x   NA  NA  NA  NA  NA  1   x     NA
x   NA  NA  NA  NA  NA  1   x     NA
x   y   NA  NA  NA  NA  1   x     y
NA  NA  x   NA  NA  NA  2   NA    x
NA  NA  x   y   NA  NA  2   y     x
NA  NA  NA  NA  x   NA  3   NA    x
NA  NA  NA  NA  x   NA  3   NA    x
NA  NA  NA  NA  x   NA  3   NA    x
NA  NA  NA  NA  x   NA  3   x     x
NA  NA  NA  NA  NA  x   4   NA    x