如果我有一些可以建模的数据:
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
,如果 c1
和 0
如果 c2
从 1
填充 3:5 列。我想用
apply
和 ifelse
来做这件事,但不知道如何用 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/