gpt4 book ai didi

r - 如果值超出范围,则设置为 NA

转载 作者:行者123 更新时间:2023-12-04 11:53:46 24 4
gpt4 key购买 nike

我的数据集包含 6 个字段和 4 行带有一些 NA 值。

a=c(5,6,7,12)
b=c(7,2,3,4)
c=c(8,8,21)
d=c(1,1)
e=c(1,2,5,9)
f=c(20,3,11)
length(c)=4
length(d)=4
length(f)=4
z=data.frame(a,b,c,d,e,f)


a b c d e f
5 7 8 1 1 20
6 2 8 1 2 3
7 3 21 NA 5 11
12 4 NA NA 9 NA

这是我需要做的:对于字段 a、c、d 和 f 如果值小于 6 或大于 12,那么我需要将其设置为 NA。此外,如果该值已经是 NA,则没有变化(保持 NA)。

我可以对每个字段使用 ifelse 来做到这一点,但是我的数据包含数十个字段,所以我想知道是否有一个有效的这样做的方法。

最终的数据是

a   b   c   d   e   f
NA 7 8 NA 1 NA
6 2 8 NA 2 NA
7 3 NA NA 5 11
12 4 NA NA 9 NA

最佳答案

使用列索引('v1'),我们对数据集'z'进行子集化,将基于逻辑条件为真的元素更改为NA by is.na.

v1 <- c('a', 'c', 'd', 'f')
is.na(z[v1]) <- z[v1] < 6 | z[v1] >12
z
# a b c d e f
#1 NA 7 8 NA 1 NA
#2 6 2 8 NA 2 NA
#3 7 3 NA NA 5 11
#4 12 4 NA NA 9 NA

或者@DavidArenburg 建议的更快的方法是

z[v1][z[v1] < 6 | z[v1] > 12] <- NA

或@DavidArenburg 提供的 data.table 选项。我们将 'data.frame' 转换为 'data.table' (setDT(z)),遍历 'v1' 中指定的列并 set 满足NA 的条件。这会更快,因为避免了 [.data.table 中的开销。

library(data.table)
setDT(z)
for(j in v1){
set(z, i = which(z[[j]] < 6 | z[[j]] > 12), j = j, value = NA_integer_)
}

z
# a b c d e f
#1: NA 7 8 NA 1 NA
#2: 6 2 8 NA 2 NA
#3: 7 3 NA NA 5 11
#4: 12 4 NA NA 9 NA

关于r - 如果值超出范围,则设置为 NA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32340979/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com