为数据帧的行中的非零元素分配不同的值

时间:2017-02-13 19:15:38

标签: r dataframe

例如,我有数据帧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))

4 个答案:

答案 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