我有一个看起来像这样的大数据框
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")
任何想法都将不胜感激!
答案 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