R 将行子集的数据从一组列移动到另一组列

R 将行子集的数据从一组列移动到另一组列,r,tidyverse,mutate,data-wrangling,R,Tidyverse,Mutate,Data Wrangling,我有一个数据帧 df <- tibble( id = 1:10, family = c("a","a","b","b","c", "d", "e", "f", "g", "h"), col1_a = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), col1_b = c(1, 2, 3, 4, NA, NA, NA, NA, NA, NA), col2_a = c(11, 12, 13, 14, 15, 16, 17, 18, 19, 20),

我有一个数据帧

df <- tibble(
  id = 1:10, 
  family = c("a","a","b","b","c", "d", "e", "f", "g", "h"),
  col1_a = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
  col1_b = c(1, 2, 3, 4, NA, NA, NA, NA, NA, NA),
  col2_a = c(11, 12, 13, 14, 15, 16, 17, 18, 19, 20),
  col2_b = c(11, 12, 13, 14, NA, NA, NA, NA, NA, NA),
  )

df我将在两个主要步骤中完成此操作,首先创建
fam_count
列,以确定哪些家庭只有1人。然后,创建两个
rand
列,以确定是否使用
b
列中的值

library(tidyverse)
set.seed(1)

df %>% group_by(family) %>% 
  mutate(fam_count = n()) %>% 
  ungroup() %>% 
  mutate(
    rand1 = sample(c(NA, 1), nrow(.), replace = TRUE),
    rand2 = sample(c(NA, 1), nrow(.), replace = TRUE),
    col1_b = ifelse(fam_count == 1, rand1 * col1_a, col1_b),
    col2_b = ifelse(fam_count == 1, rand2 * col2_a, col2_b)
  ) %>%
  mutate(
    col1_a = ifelse(fam_count == 1 & !is.na(col1_b), NA, col1_a),
    col2_a = ifelse(fam_count == 1 & !is.na(col2_b), NA, col2_a)
  ) %>%
  select(-rand1, -rand2, - fam_count)

# A tibble: 10 x 6
      id family col1_a col1_b col2_a col2_b
   <int> <chr>   <int>  <dbl>  <int>  <dbl>
 1     1 a           1      1     11     11
 2     2 a           2      2     12     12
 3     3 b           3      3     13     13
 4     4 b           4      4     14     14
 5     5 c           5     NA     NA     15
 6     6 d           6     NA     NA     16
 7     7 e          NA      7     17     NA
 8     8 f           8     NA     NA     18
 9     9 g          NA      9     19     NA
10    10 h          10     NA     20     NA
库(tidyverse)
种子(1)
df%%>%分组依据(家族)%%>%
突变(fam_count=n())%>%
解组()%>%
变异(
rand1=样本(c(NA,1),nrow(.),replace=TRUE),
rand2=样本(c(NA,1),nrow(.),replace=TRUE),
col1_b=ifelse(fam_count==1,rand1*col1_a,col1_b),
col2_b=ifelse(fam_count==1,rand2*col2_a,col2_b)
) %>%
变异(
col1_a=ifelse(fam_count==1&!is.na(col1_b),na,col1_a),
col2_a=ifelse(fam_count==1&!is.na(col2_b),na,col2_a)
) %>%
选择(-rand1,-rand2,-fam\u计数)
#一个tibble:10x6
身份证家庭col1_a col1_b col2_a col2_b
111111
2 a 2 12 12
33B31313
44B 4414
5c5na15
6D6Na16
7 e NA 7 17 NA
8F 8NA 18
9克钠9 19钠
10H10Na20Na

用我忘记添加的信息更新问题。
library(tidyverse)
set.seed(1)

df %>% group_by(family) %>% 
  mutate(fam_count = n()) %>% 
  ungroup() %>% 
  mutate(
    rand1 = sample(c(NA, 1), nrow(.), replace = TRUE),
    rand2 = sample(c(NA, 1), nrow(.), replace = TRUE),
    col1_b = ifelse(fam_count == 1, rand1 * col1_a, col1_b),
    col2_b = ifelse(fam_count == 1, rand2 * col2_a, col2_b)
  ) %>%
  mutate(
    col1_a = ifelse(fam_count == 1 & !is.na(col1_b), NA, col1_a),
    col2_a = ifelse(fam_count == 1 & !is.na(col2_b), NA, col2_a)
  ) %>%
  select(-rand1, -rand2, - fam_count)

# A tibble: 10 x 6
      id family col1_a col1_b col2_a col2_b
   <int> <chr>   <int>  <dbl>  <int>  <dbl>
 1     1 a           1      1     11     11
 2     2 a           2      2     12     12
 3     3 b           3      3     13     13
 4     4 b           4      4     14     14
 5     5 c           5     NA     NA     15
 6     6 d           6     NA     NA     16
 7     7 e          NA      7     17     NA
 8     8 f           8     NA     NA     18
 9     9 g          NA      9     19     NA
10    10 h          10     NA     20     NA