我有一个看起来像以下结构的数据集,但是我需要基于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
答案 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>