如何基于R中行值的组合创建新变量(列)?

时间:2020-05-23 19:19:38

标签: r dataframe dplyr tidyverse

我想基于行值的组合创建一个新的变量/列。我有超过7万个ID,每个ID有四行(每年一排,2013-2016年)。对于每年,它们的值为“ 0”或“ 1”。对于2013年,每个人都只能使用“ 0”,对于2014-2016年,他们只能具有全部为“ 0”或全部为“ 1”(因此有两种可能的组合:0000或0111;但在单独的行中)。

我想创建一个新变量,以指示ID属于哪个组。因此,如果ID在四年中的组合为“ 0000”,那么我希望该新列中的所有年份都为0。而且,如果ID的组合为“ 0111”,那么我希望该新列的所有年份都为1。这样,我可以为我的分析创建一个对照和一个治疗组。我的数据框包含其他变量,例如性别。

structure(list(Year = c(2013, 2014, 2015, 2016, 2013, 2014, 2015, 
2016), Value = c(0, 0, 0, 0, 0, 1, 1, 1), ID = c(1, 1, 1, 1, 
2, 2, 2, 2), Gender = c(0, 0, 0, 0, 0, 0, 0, 0)), row.names = c(NA, 
-8L), class = c("tbl_df", "tbl", "data.frame"))

tibble [8 x 4] (S3: tbl_df/tbl/data.frame)
 $ Year  : num [1:8] 2013 2014 2015 2016 2013 ...
 $ Value : num [1:8] 0 0 0 0 0 1 1 1
 $ ID    : num [1:8] 1 1 1 1 2 2 2 2
 $ Gender: num [1:8] 0 0 0 0 0 0 0 0

我已经尝试过这些代码,但是无法使它们在我的数据框上工作。 -How do I create a new column based on multiple conditions from multiple columns? -How to create new variable based on a combination of values in other variables

希望有人有一些提示!

谢谢您的帮助!

1 个答案:

答案 0 :(得分:3)

我们可以检查any 1s(通过as.logical二进制转换为逻辑)并使用+as.integer强制将其转换回二进制

library(dplyr)
df1 %>%
    group_by(ID) %>% 
    mutate(new = +any(as.logical(Value)))