R 创建组虚拟变量

R 创建组虚拟变量,r,function,dataframe,dummy-variable,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

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

   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
我很难弄清楚如何创建这个虚拟变量组。我是将其作为单独的函数编写,如下所示,还是有更简单的方法

dummy<- function (df$V1){
if (df$V1==1)
   return ("Group1")
任何想法都非常感谢

一种可能性是使用apply并按行检查V1到V3中哪一个等于1:

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
资料

一种可能性是使用apply并按行检查V1到V3中的哪一个等于1:

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
资料


假设在V列之前有2列,我们可以使用max.col like

如果中间的列中有变量,我们可以将它们子集并使用max.col


假设在V列之前有2列,我们可以使用max.col like

如果中间的列中有变量,我们可以将它们子集并使用max.col


应用的另一个快速用法是:

v1 1 NA v1 >2 NA v1 >3 NA v1 >4 NA 1 v2 >5 NA 2 v2 >6 NA 3 v2
应用的另一个快速用法是:

v1 1 NA v1 >2 NA v1 >3 NA v1 >4 NA 1 v2 >5 NA 2 v2 >6 NA 3 v2
我总共有150个变量-V1,V2,V3在middle@IG114更新了答案,这样无论这些变量在哪里,它都能工作。我总共有150个变量-V1、V2、V3在middle@IG114更新了答案,这样无论这些变量在哪里,它都能工作。非常感谢!当我检查我的_df$组时,输出类似于以下组CV1=1 GroupcV5=5 GroupcV2=2 GroupcV2=2。如何更改标签,使其仅为组1、组2等?嗯,应用返回的结果似乎不是单个数字,而是类似于Q3=1的数字。您确定使用了==?也许您可以调整示例以更好地匹配原始数据帧。只是更新了示例以匹配我在datasetI中的实际列标签。我认为这可能是因为您的行中有多个列等于1?虽然我被你的数字5和2弄糊涂了。。。这对我来说是不可复制的,但我编辑了我的答案,以说明多个列可能等于1。我没有多个列等于1的行。对于每个观测值1:5,Q3或Q40或Q41都是1,相互排斥。当我运行df$组时,非常感谢!当我检查我的_df$组时,输出类似于以下组CV1=1 GroupcV5=5 GroupcV2=2 GroupcV2=2。如何更改标签,使其仅为组1、组2等?嗯,应用返回的结果似乎不是单个数字,而是类似于Q3=1的数字。您确定使用了==?也许您可以调整示例以更好地匹配原始数据帧。只是更新了示例以匹配我在datasetI中的实际列标签。我认为这可能是因为您的行中有多个列等于1?虽然我被你的数字5和2弄糊涂了。。。这对我来说是不可复制的,但我编辑了我的答案,以说明多个列可能等于1。我没有多个列等于1的行。对于每个观测值1:5,Q3或Q40或Q41都是1,相互排斥。当我运行df$Group时
paste0("Group", max.col(replace(df, is.na(df), 0) == 1) - 2)
#[1] "Group1" "Group3" "Group2" "Group3" "Group1"
sub_df <- df[grep("^V", names(df))]
paste0("Group", max.col(replace(sub_df, is.na(sub_df), 0) == 1))