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可以分布在列中的任何位置Tryfor(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]]])
}