如果我有一些可以建模的数据:

c1 <- c("A","B","C","A")
c2 <- c("a", "a", "b", "c")
c3 <- c(0, 1, 0, 0)
c4 <- c(0, 0, 0, 1)
c5 <- c(1, 0, 0, 0)

df <- data.frame(c1 = c1, c2 = c2, c3 = c3, c4 = c4, c5 = c5)

我想要一个数组 array.filled ,如果 c10 如果 c21 填充 3:5 列。

我想用 applyifelse 来做这件事,但不知道如何用 apply(df, 2, function(x), ifelse(x == 0, ?, x)) 引用列(在这种情况下,我会这样做两次)。

最佳答案

关于 ifelse()
ifelse 的基本用法如下:

ifelse(c3 == 0, c1, c2)  ## ifelse(condition, if(TRUE), if(FALSE))

如果 c3 == 0 需要 c1 ;否则需要 c2 。您还可以查看 ?ifelse 了解更多信息。

使用 apply()

要将其应用于 df[, 3:5] ,请执行以下操作:
foo <- function(x, opt0, opt1) ifelse(x == 0, opt0, opt1)
array.filled <- apply(df[, 3:5], 2, foo, opt0 = df[, 1], opt1 = df[, 2])

#     c3  c4  c5
#[1,] "A" "A" "a"
#[2,] "a" "B" "B"
#[3,] "C" "C" "C"
#[4,] "A" "c" "A"

使用 sapply()

另一种/更好的方法是使用 sapply :
# still using the `foo` defined above
array.filled <- sapply(df[3:5], foo, opt0 = df$c1, opt1 = df$c2)

#     c3  c4  c5
#[1,] "A" "A" "a"
#[2,] "a" "B" "B"
#[3,] "C" "C" "C"
#[4,] "A" "c" "A"

关于使用向下应用行时的 R 引用列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37601633/

10-12 21:23