根据特定列生成列,但用其他列的值填充

时间:2020-04-29 01:37:25

标签: r dplyr

我有一个看起来像以下结构的数据集,但是我需要基于v2生成列,但要填充v3的值。我该如何完成?所需的结果如下所示。

df <- data_frame(v1 = c(3, 3, 2, 2, 3, 1, 1, 1, 0), v2 = c("a", "b", "a", "c", "c", "b", "c", "a", "a"), v3 = c("y", "y", "n","y", "n","y", "y",NA, "n"))
> df
# A tibble: 9 x 3
     v1 v2    v3   
  <dbl> <chr> <chr>
1     3 a     y    
2     3 b     y    
3     2 a     n    
4     2 c     y    
5     3 c     n    
6     1 b     y    
7     1 c     y    
8     1 a     NA   
9     0 a     n

所需结果:按v1分组,在v2中标识v3 ==“ a”的值,并使用该值生成一列v_a。将相同的合理性应用于v2的其他类别。

# A tibble: 9 x 4
     v1 v2    v3    v_a    ...
  <dbl> <chr> <chr> <chr> 
1     3 a     y     y     
2     3 b     y     y         
3     2 a     n     n         
4     2 c     y     n     
5     3 c     n     y     
6     1 b     y    NA    
7     1 c     y    NA     
8     1 a     NA   NA    
9     0 a     n    n

2 个答案:

答案 0 :(得分:2)

我们可以获取宽格式的数据并进行连接:

library(dplyr)

df %>%
 tidyr::pivot_wider(names_from = v2, values_from = v3, names_prefix = 'v_') %>%
 left_join(df, by = 'v1')

# A tibble: 9 x 6
#     v1 v_a   v_b   v_c   v2    v3   
#  <dbl> <chr> <chr> <chr> <chr> <chr>
#1     3 y     y     n     a     y    
#2     3 y     y     n     b     y    
#3     3 y     y     n     c     n    
#4     2 n     NA    y     a     n    
#5     2 n     NA    y     c     y    
#6     1 NA    y     y     b     y    
#7     1 NA    y     y     c     y    
#8     1 NA    y     y     a     NA   
#9     0 n     NA    NA    a     n    

要使名称取反,我们可以使用:

cols<- unique(df$v2)

df %>%
  tidyr::pivot_wider(names_from = v2, values_from = v3) %>%
  left_join(df, by = 'v1') %>%
  rename_at(vars(cols), ~paste0(., '_v'))

答案 1 :(得分:1)

使用data.table的选项:

uv <- setDT(df)[, unique(v2)]
df[, paste0(uv, "_v") := lapply(uv, function(x) 
    if(any(v2==x)) v3[v2==x] else NA_character_), v1]

输出:

   v1 v2   v3  a_v  b_v  c_v
1:  3  a    y    y    y    n
2:  3  b    y    y    y    n
3:  2  a    n    n <NA>    y
4:  2  c    y    n <NA>    y
5:  3  c    n    y    y    n
6:  1  b    y <NA>    y    y
7:  1  c    y <NA>    y    y
8:  1  a <NA> <NA>    y    y
9:  0  a    n    n <NA> <NA>