Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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
R 将ifelse()应用于另一列上具有动态意外事件的多列_R_Loops - Fatal编程技术网

R 将ifelse()应用于另一列上具有动态意外事件的多列

R 将ifelse()应用于另一列上具有动态意外事件的多列,r,loops,R,Loops,我有一个包含NAs的数据集。我想用另一个第二列的值来填充这些值。但是,此次列是动态的,并且会根据主列的不同而变化 为了举例说明,我想复制以下过程: l1 <- c("A", "A", "A", "A") l2 <- c(NA, "B", "B", "B") l3 <- c(NA, NA, "C", "C") l4 <- c(NA, NA, NA, "D") prodmap <- data.frame(l1, l2, l3, l4) prodmap[] <-

我有一个包含
NAs
的数据集。我想用另一个第二列的值来填充这些值。但是,此次列是动态的,并且会根据主列的不同而变化

为了举例说明,我想复制以下过程:

l1 <- c("A", "A", "A", "A")
l2 <- c(NA, "B", "B", "B")
l3 <- c(NA, NA, "C", "C")
l4 <- c(NA, NA, NA, "D")

prodmap <- data.frame(l1, l2, l3, l4)

prodmap[] <- lapply(prodmap, as.character) 

prodmap$l2 <- ifelse(is.na(prodmap$l2), prodmap$l1, prodmap$l2)
prodmap$l3 <- ifelse(is.na(prodmap$l3), prodmap$l2, prodmap$l3)
prodmap$l4 <- ifelse(is.na(prodmap$l4), prodmap$l3, prodmap$l4)

l1使用
upper.tri的选项

prodmap[upper.tri(prodmap)] <- t(prodmap)[upper.tri(prodmap)]
prodmap
#  l1 l2 l3 l4
#1  A  A  A  A
#2  A  B  B  B
#3  A  B  C  C
#4  A  B  C  D

prodmap[upper.tri(prodmap)]由于下一列取决于上一列,我们可以使用带有索引的
for
循环来实现这一点

for(i in 2:ncol(prodmap)) prodmap[[i]] <- ifelse(is.na(prodmap[[i]]), 
              prodmap[[i-1]], prodmap[[i]])
prodmap
#  l1 l2 l3 l4
#1  A  A  A  A
#2  A  B  B  B
#3  A  B  C  C
#4  A  B  C  D

注意:假设NAs可以分布在列中的任何位置

Try
for(2:4中的i)prodmap[[i]]谢谢!但我相信这会通过索引调用列,对吗?我正在寻找一种按名称动态寻址列的方法。这比较容易,但如果您想传递列名,也可以使用
nm1
nm1 <- tail(names(prodmap), -1)
nm2 <- head(names(prodmap), -1)
for(i in seq_along(nm1)) {
  prodmap[[nm1[i]]] <- ifelse(is.na(prodmap[[nm1[i]]]), 
                               prodmap[[nm2[i]]],
                               prodmap[[nm1[i]]])
   }