Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用其他列中的条件以及loop/Lappy/mutate-Over中循环列的数字索引_R_Missing Data - Fatal编程技术网

使用其他列中的条件以及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