我试图选择至少有一行等于1的列,只有当同一行在第二列中也有一定值时。我更愿意使用dplyr实现这一目标,但欢迎任何计算效率高的解决方案。
示例:
选择a1,a2,a3中的列,其中至少包含一行,其值为1,其中列b ==" B"
示例数据:
rand <- function(S) {set.seed(S); sample(x = c(0,1),size = 3, replace=T)}
df <- data.frame(a1=rand(1),a2=rand(2),a3=rand(3),b=c("A","B","A"))
输入数据:
a1 a2 a3 b
1 0 0 0 A
2 0 1 1 B
3 1 1 0 A
期望的输出:
a2 a3
1 0 0
2 1 1
3 1 0
我设法使用以下代码获取正确的输出,但这是一个非常低效的解决方案,我需要在非常大的数据帧(365,000行X 314列)上运行它。
df %>% select_if(function(x) any(paste0(x,.$b) == '1B'))
答案 0 :(得分:3)
解决方案,不使用dplyr:
df[sapply(df[df$b == "B",], function(x) 1 %in% x)]
答案 1 :(得分:2)
这是我的dplyr
解决方案:
ids <- df %>%
reshape2::melt(id.vars = "b") %>%
filter(value == 1 & b == "B") %>%
select(variable)
df[,unlist(ids)]
# a2 a3
#1 0 0
#2 1 1
#3 1 0
正如@ docendo-discimus所建议的那样,转换为长格式
更容易