R - 根据条件处理数据框行

R - work on data frame rows based on condition

我想了解如何根据条件处理数据框的行。 有这样的数据框

> d<-data.frame(x=c(0,1,2,3), y=c(1,1,1,0))
> d
  x y
1 0 1
2 1 1
3 2 1
4 3 0

如何将 +1 添加到所有包含零值的行? (请注意,零可以在任何列中找到),因此结果将如下所示:

  x y
1 1 2
2 1 1
3 2 1
4 4 1

以下代码似乎完成了部分工作,但只是打印执行操作的行,执行次数 (2)...

> for(i in 1:nrow(d)){
+     d[d[i,]==0,]<-d[i,]+1
+ }
> d
  x y
1 1 2
2 4 1
3 1 2
4 4 1

我确定有一个简单的解决方案,也许是一个应用函数?但我没有做到。

谢谢。

一些可能性:

# 1
idx <- which(d == 0, arr.ind = TRUE)[, 1]
d[idx, ] <- d[idx, ] + 1
# 2
t(apply(d, 1, function(x) x + any(x == 0)))
# 3
d + apply(d == 0, 1, max)

which 用于向量,例如which(1:3 > 2) 很常见,而它很少用于矩阵:通过指定 arr.ind = TRUE 我们得到的是数组索引,即每个 0 的坐标:

which(d == 0, arr.ind = TRUE)
     row col
[1,]   1   1
[2,]   4   2

因为我们只对出现零的行感兴趣,所以我取 which(d == 0, arr.ind = TRUE) 的第一列并将这些行中的所有元素加 1 d[idx, ] <- d[idx, ] + 1

关于第二种方法,apply(d, 1, function(x) x) 将简单地逐行进行并返回同一行而不进行任何修改。通过 any(x == 0) 我们检查特定行中是否有任何零并得到 TRUEFALSE。但是,通过编写 x + any(x == 0),我们根据需要分别将 TRUEFALSE 转换为 1 或 0。

现在是第三种方法。 d == 0 是一个逻辑矩阵,我们使用 apply 遍历它的行。然后,当将 max 应用于特定行时,我们再次将 TRUEFALSE 转换为 1、0 并找到最大元素。当且仅当该行中有任何零时,此元素为 1。因此,apply(d == 0, 1, max) returns 一个由 0 和 1 组成的向量。最后一点就是当我们写A + b的时候,其中A是一个矩阵,b是一个向量,加法是按列的。这样,通过编写 d + apply(d == 0, 1, max) 我们根据需要将 apply(d == 0, 1, max) 添加到 d 的每一列。