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

标签 r conditional

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

> 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到特定行,我们再次转换 TRUE , FALSE到 1, 0 并找到最大元素。当且仅当该行中有任何零时,该元素为 1。因此,apply(d == 0, 1, max)返回一个由 0 和 1 组成的向量。最后一点是,当我们写A + b ,其中 A是一个矩阵和 b是一个向量,加法是按列进行的。这样,通过写d + apply(d == 0, 1, max)我们添加 apply(d == 0, 1, max)d 的每一列, 如所须。

关于R - 根据条件处理数据框行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34055485/

相关文章:

基于目标值的 C# AutoMapper 条件映射

java - 找到三元组中间值的最快方法?

php - php wordpress 根据非本地IP地址条件隐藏特定导航项

r - 如何在 R 中从具有 Pareto 尾部的对数正态分布生成样本?

java - 提供不是 boolean 值的循环条件

r - 如何从距离矩阵中提取组内和组间距离?在 R

rgl: > rgl.clear(type, subscene = subscene) 中的错误:找不到对象 'rgl_clear'

python - 条件格式 xlwt

r - ggplot中的两个填充变量

r - 如何与 Azure 数据工厂一起执行 R 脚本?