R有条件替换为 '['且没有子集()

标签 r replace dataframe subset

我想有条件地替换 data.frame 中的一些值。

假设我有:

a <- c(1, 4, 5, 7, 9, 8, 3, 90)
b <- c(21, 24, 25, NA, 9, 23, NA, 3)
c <- c(214, 5, NA, NA, 59, NA, 32, 12)
d <- rep(0, 8)
test.df <- data.frame(a, b, c, d)
test.df
   a  b   c d
1  1 21 214 0
2  4 24   5 0
3  5 25  NA 0
4  7 NA  NA 0
5  9  9  59 0
6  8 23  NA 0
7  3 NA  32 0
8 90  3  12 0

我的第一个问题是为什么下面的命令返回的结果不同?为什么第二个返回带有 NA 的行?第二个错误是什么?

subset(test.df, test.df$a >=4 & !is.na(test.df$b) & test.df$c > 4)
   a  b  c d
2  4 24  5 0
5  9  9 59 0
8 90  3 12 0

test.df[test.df$a >=4 & !is.na(test.df$b) & test.df$c > 4, ]
      a  b  c  d
2     4 24  5  0
NA   NA NA NA NA
5     9  9 59  0
NA.1 NA NA NA NA
8    90  3 12  0

我的第二个问题是,根据上述标准,如何将列的 d 值替换为 10 以获得:

 test.df
   a  b   c  d
1  1 21 214  0
2  4 24   5 10
3  5 25  NA  0
4  7 NA  NA  0
5  9  9  59 10
6  8 23  NA  0
7  3 NA  32  0
8 90  3  12 10

?

谢谢!

最佳答案

1) 您的标准 test.df$a >=4 & !is.na(test.df$b) & test.df$c > 4 评估为:

[1] FALSE  TRUE    NA FALSE  TRUE    NA FALSE  TRUE

如文档所述,subset 将过滤掉标准评估为 NA 的行(3 和 6)。另一方面,[ 为您提供一行 NA,因为不确定它们是否应该包含 (TRUE) 或排除()。

2) 我会使用 transform 和改进的标准:

test.df <- transform(test.df, d = ifelse(!is.na(a) &
                                         !is.na(b) &
                                         !is.na(c) &
                                         a >= 4    &
                                         c >  4, 10, d))

关于R有条件替换为 '['且没有子集(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23330431/

相关文章:

r - 在 R 中的较大 map 中创建插入 map

java - 正则表达式删除所有非字母数字字符并提供通用语言支持?

python - panda groupby agg 和计算函数一起

python - 无法在 Pandas 中创建锯齿状数据框?

r - 渲染时,Markdown 将我的表格放在文档的末尾

r - Shiny 的交互式 ggplot 缺少误差线

r - 在函数的给定行中设置调试代码的快速方法是什么?

regex - 使用脚本将正则表达式替换全局应用于许多文件

powershell - Powershell替换功能-用数字替换行

python - 如何在 Pandas 系列中找到与输入数字最接近的值?