例如,我有数据帧xx,它有n1行和n2列。我有一个向量X有n1个元素。是否有一个函数可以将X的相应元素分配给每行数据帧xx的非零元素?也就是说,在此过程之后,每行中的所有非零元素将具有相同的值。
我知道for循环可以做到这一点。但我想知道是否有一个可以做到这一点的功能?
以下是一个例子:
xx = data.frame(x = c(0, 1, 0, 2, 3), y = c(0, 1, 3, 0,2), z = c(1, 0, 1, 3, 1))
X = c(1, 2, 3, 4, 5)
我想要一些可以产生像
这样的data.frame的函数xxOut <- data.frame(x = c(0, 2, 0, 4, 5), y = c(0, 2, 3, 0,5), z = c(1, 0, 3, 4, 5))
答案 0 :(得分:4)
通过基地R的方式,
xx[] <- lapply(xx, function(i) mapply(function(z, j) replace(z, z != 0, j), i, X))
> xx
# x y z
#1 0 0 1
#2 2 2 0
#3 0 3 3
#4 4 0 4
#5 5 5 5
答案 1 :(得分:4)
以下方法,也是基础R也可以。
xx[xx !=0] <- rep(X, length(xx))[xx !=0]
xx
x y z
1 0 0 1
2 2 2 0
3 0 3 3
4 4 0 4
5 5 5 5
答案 2 :(得分:3)
这是第三种解决方案。
newx <- split(xx, 1:nrow(xx))
do.call(rbind, mapply(FUN = function(n1, n2) {
n1[n1 != 0] <- n2
n1
}, n1 = newx, n2 = as.list(X), SIMPLIFY = FALSE))
x y z
1 0 0 1
2 2 2 0
3 0 3 3
4 4 0 4
5 5 5 5
答案 3 :(得分:2)
以下是使用sweep
xx[] <- sweep(!!xx, 1, X, `*`)
xx
# x y z
#1 0 0 1
#2 2 2 0
#3 0 3 3
#4 4 0 4
#5 5 5 5