使用其他列中的条件以及loop/Lappy/mutate-Over中循环列的数字索引
我有这样一个数据帧:使用其他列中的条件以及loop/Lappy/mutate-Over中循环列的数字索引,r,missing-data,R,Missing Data,我有这样一个数据帧: > df V1 V2 V3 V4 V5 V6 1 1 1 2 NA 1 0 2 0 0 2 1 NA 1 3 1 0 2 1 1 NA 4 0 1 2 0 0 NA 5 1 0 2 1 1 NA 6 0 0 2 NA 1 1 7 0 1 2 NA 1 NA 8 0 0 2 NA 1 NA 9 1 0 2 1 1 1 10 0 1 2 1 1 NA
> df
V1 V2 V3 V4 V5 V6
1 1 1 2 NA 1 0
2 0 0 2 1 NA 1
3 1 0 2 1 1 NA
4 0 1 2 0 0 NA
5 1 0 2 1 1 NA
6 0 0 2 NA 1 1
7 0 1 2 NA 1 NA
8 0 0 2 NA 1 NA
9 1 0 2 1 1 1
10 0 1 2 1 1 NA
dput如下所示(编辑:已更正):
df
运算符输入我的代码。如有任何建议,我将不胜感激!谢谢 我认为这是可行的。这有点难说,因为dput()
与问题中打印的数据不匹配
df <- structure(list(V1 = c(1L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 1L, 0L),
V2 = c(1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L), V3 = c(2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), V4 = c(NA, 1L, 1L, NA,
1L, NA, NA, NA, 1L, 1L), V5 = c(1L, NA, 1L, 1L, NA, 1L, 1L,
1L, 1L, 1L), V6 = c(NA, 1L, NA, NA, NA, 1L, NA, NA, 1L, NA
)), class = "data.frame", row.names = c(NA, -10L))
df
# V1 V2 V3 V4 V5 V6
# 1 1 1 2 NA 1 NA
# 2 0 0 2 1 NA 1
# 3 1 0 2 1 1 NA
# 4 0 1 2 NA 1 NA
# 5 1 0 2 1 NA NA
# 6 0 0 2 NA 1 1
# 7 0 1 2 NA 1 NA
# 8 0 0 2 NA 1 NA
# 9 1 0 2 1 1 1
# 10 0 1 2 1 1 NA
library(dplyr)
cols_to_loop = c("V4", "V5", "V6")
for (i in seq_along(cols_to_loop)) {
df = mutate(df, across(cols_to_loop[i], ~if_else(V1 == 0 & V2 == 1 & i > V3, 1L, .) ))
}
df
# V1 V2 V3 V4 V5 V6
# 1 1 1 2 NA 1 NA
# 2 0 0 2 1 NA 1
# 3 1 0 2 1 1 NA
# 4 0 1 2 NA 1 1
# 5 1 0 2 1 NA NA
# 6 0 0 2 NA 1 1
# 7 0 1 2 NA 1 1
# 8 0 0 2 NA 1 NA
# 9 1 0 2 1 1 1
# 10 0 1 2 1 1 1
dfv3,1L,))
}
df
#V1 V2 V3 V4 V5 V6
#1 1 2 NA 1 NA
#20021NA 1
#31211NA
#4 0 1 2 NA 1 1
#51021NA
#62002NA11
#7 0 1 2 NA 1 1
#80 0 2 NA 1 NA
# 9 1 0 2 1 1 1
# 10 0 1 2 1 1 1
<代码> >澄清——你认为V4的“数字索引”是1,V5是2,V6是3?是的,确切地说-所以索引应该从我想循环的列开始。我纠正了“DPT”——谢谢指点。同样感谢您的代码,它可以在我的测试样本上运行。明天我将在整个数据集上应用它,以检查是否存在其他问题。:)也适用于我的整个数据集。一个简短的后续问题:我试着用lappy或mutate(cross())来做这件事,因为建议避免R中的for循环。但是如果我需要计算I>V3,就没有办法绕过循环,对吗?是的,这就是我使用循环的原因-有两件事在改变,列和I
,这使得其他选项变得很困难。您可以使用mappy
,但是这个循环非常简单,我认为使用mappy
(或者purr::map2
)会让事情变得不那么清楚,为什么要麻烦呢?是的,这个循环非常简单!再次感谢!
df <- structure(list(V1 = c(1L, 0L, 1L, 0L, 1L, 0L, 0L, 0L, 1L, 0L),
V2 = c(1L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 1L), V3 = c(2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), V4 = c(NA, 1L, 1L, NA,
1L, NA, NA, NA, 1L, 1L), V5 = c(1L, NA, 1L, 1L, NA, 1L, 1L,
1L, 1L, 1L), V6 = c(NA, 1L, NA, NA, NA, 1L, NA, NA, 1L, NA
)), class = "data.frame", row.names = c(NA, -10L))
df
# V1 V2 V3 V4 V5 V6
# 1 1 1 2 NA 1 NA
# 2 0 0 2 1 NA 1
# 3 1 0 2 1 1 NA
# 4 0 1 2 NA 1 NA
# 5 1 0 2 1 NA NA
# 6 0 0 2 NA 1 1
# 7 0 1 2 NA 1 NA
# 8 0 0 2 NA 1 NA
# 9 1 0 2 1 1 1
# 10 0 1 2 1 1 NA
library(dplyr)
cols_to_loop = c("V4", "V5", "V6")
for (i in seq_along(cols_to_loop)) {
df = mutate(df, across(cols_to_loop[i], ~if_else(V1 == 0 & V2 == 1 & i > V3, 1L, .) ))
}
df
# V1 V2 V3 V4 V5 V6
# 1 1 1 2 NA 1 NA
# 2 0 0 2 1 NA 1
# 3 1 0 2 1 1 NA
# 4 0 1 2 NA 1 1
# 5 1 0 2 1 NA NA
# 6 0 0 2 NA 1 1
# 7 0 1 2 NA 1 1
# 8 0 0 2 NA 1 NA
# 9 1 0 2 1 1 1
# 10 0 1 2 1 1 1