创建组伪变量

时间:2019-10-02 13:19:23

标签: r function dataframe dummy-variable

我有一个看起来像这样的大数据框

   A  B   Q3    Q40   Q41   C
1  *  *   1     NA    NA   *
2  *  *   NA    NA    1    *
3  *  *   NA    1     NA   * 
4  *  *   NA    NA    1    *
5  *  *   1     NA    NA   *

我想创建一个虚拟变量以指示由Q3,Q40和Q41指定的组。最后,我希望输出看起来像

   A  B   Q3    Q40   Q41   C   Group
1  *  *   1     NA    NA   *   Group1
2  *  *   NA    NA    1    *   Group3
3  *  *   NA    1     NA   *   Group2
4  *  *   NA    NA    1    *   Group3
5  *  *   1     NA    NA   *   Group1

我在弄清楚如何创建此虚拟变量“ Group”时遇到了麻烦。我是将其编写为单个函数,如下所示,还是有一种更简单的方法?

dummy<- function (df$V1){
if (df$V1==1)
   return ("Group1")

任何想法都将不胜感激!

3 个答案:

答案 0 :(得分:3)

一种可能性是使用wildcard_constraints: sample= '|'.join([re.escape(x) for x in config["samples"]]), runfolder= re.escape(config["runfolder"]), 并逐行检查V1到V3中哪个等于1:

apply

数据

variables <- c("Q3", "Q40", "Q41")
# Works only for exactly one '1' per row:
# my_df$Group <- apply(my_df[variables], 1, function(x) which(x == 1))
# Works for multiple '1' per row or rows without '1': 
my_df$Group <- apply(my_df[, variables], 1, function(x) paste(which(x %in% 1), collapse = "_"))
my_df$Group <- paste0("Group", my_df$Group)
my_df
#   A B Q3 Q40 Q41 C    Group
# 1 * *  1  NA  NA *   Group1
# 2 * * NA  NA   1 *   Group3
# 3 * * NA   1  NA *   Group2
# 4 * * NA  NA   1 *   Group3
# 5 * *  1  NA   1 * Group1_3

答案 1 :(得分:2)

假设您在V列之前有2列,我们可以像这样使用max.col

paste0("Group", max.col(replace(df, is.na(df), 0) == 1) - 2)
#[1] "Group1" "Group3" "Group2" "Group3" "Group1"

如果中间列中存在变量,我们可以将其子集并使用max.col

sub_df <- df[grep("^V", names(df))]
paste0("Group", max.col(replace(sub_df, is.na(sub_df), 0) == 1))

答案 2 :(得分:0)

另一个快速使用apply的方法:

v1 <- c(1:3, NA, NA , NA)
v2 <- c(NA, NA , NA, 1:3)
df0 <- tibble::tibble(v1, v2)
df0[["group"]] <- apply(df0, 1, function(x) names(x)[!is.na(x)])
df0
#> # A tibble: 6 x 3
#>      v1    v2 group
#>   <int> <int> <chr>
#> 1     1    NA v1   
#> 2     2    NA v1   
#> 3     3    NA v1   
#> 4    NA     1 v2   
#> 5    NA     2 v2   
#> 6    NA     3 v2