gpt4 book ai didi

r - 设置所有相同的值 NA、groupwise 和 colwise

转载 作者:行者123 更新时间:2023-12-02 08:13:18 24 4
gpt4 key购买 nike

我希望将每个列和组出现的所有相等/相同值(唯一 == 1)设置为 NA:
如果每个组和 col 我们至少有 2 个不同的值,我想保留它们。

很难解释。以下是一些示例数据:

代表。示例:

ds <- data.frame()
for (i in 1:3) {
for(ii in 1:3) {
ds <- rbind(mtcars[i,1:4],ds)
}
}
rownames(ds) <- NULL
ds[1,1] <- 1337;ds[2:3,3] <- 1337;ds[5,2] <- 1337;ds[8,1] <- 1337;
ds <- cbind(group=rep(1:3,each=3),ds,stringis=c("a","a","a","b","c","d","e","e","f"))

看起来像:

> ds
group mpg cyl disp hp stringis
1 1 1337.0 4 108 93 a
2 1 22.8 4 1337 93 a
3 1 22.8 4 1337 93 a
4 2 21.0 6 160 110 b
5 2 21.0 1337 160 110 c
6 2 21.0 6 160 110 d
7 3 21.0 6 160 110 e
8 3 1337.0 6 160 110 e
9 3 21.0 6 160 110 f
>

期望的输出是:

> ds
group mpg cyl disp hp stringis
1 1 1337.0 NA 108 NA NA
2 1 22.8 NA 1337 NA NA
3 1 22.8 NA 1337 NA NA
4 2 NA 6 NA NA b
5 2 NA 1337 NA NA c
6 2 NA 6 NA NA d
7 3 21.0 NA NA NA e
8 3 1337.0 NA NA NA e
9 3 21.0 NA NA NA f
>

我认为我可以在 tapply 中使用 sapply 来做到这一点,但我认为应该有更好、更易读/更快的解决方案。

寻找通用解决方案。实际上,这些组并不总是三重组等。

最佳答案

这是一个想法,

f1 <- function(x) replace(x, length(unique(x)) == 1, NA) 

library(dplyr)

ds %>%
group_by(group) %>%
mutate_all(funs(f1))

#Source: local data frame [9 x 6]
#Groups: group [3]

# group mpg cyl disp hp stringis
# <int> <dbl> <dbl> <dbl> <dbl> <fctr>
#1 1 1337.0 NA 108 NA NA
#2 1 22.8 NA 1337 NA NA
#3 1 22.8 NA 1337 NA NA
#4 2 NA 6 NA NA b
#5 2 NA 1337 NA NA c
#6 2 NA 6 NA NA d
#7 3 21.0 NA NA NA e
#8 3 1337.0 NA NA NA e
#9 3 21.0 NA NA NA f

或者如果你不想定义一个函数,那么

ds %>% 
group_by(group) %>%
mutate_all(funs(replace(., length(unique(.)) == 1, NA)))

数据表

library(data.table)
setDT(ds)[, lapply(.SD, f1), by = group][]

# group mpg cyl disp hp stringis
#1: 1 1337.0 NA 108 NA NA
#2: 1 22.8 NA 1337 NA NA
#3: 1 22.8 NA 1337 NA NA
#4: 2 NA 6 NA NA b
#5: 2 NA 1337 NA NA c
#6: 2 NA 6 NA NA d
#7: 3 21.0 NA NA NA e
#8: 3 1337.0 NA NA NA e
#9: 3 21.0 NA NA NA f

基础 R

ds[-1] <- lapply(ds[-1], function(i) with(ds, ave(i, group, FUN = f1)))

ds
# group mpg cyl disp hp stringis
#1 1 1337.0 NA 108 NA <NA>
#2 1 22.8 NA 1337 NA <NA>
#3 1 22.8 NA 1337 NA <NA>
#4 2 NA 6 NA NA b
#5 2 NA 1337 NA NA c
#6 2 NA 6 NA NA d
#7 3 21.0 NA NA NA e
#8 3 1337.0 NA NA NA e
#9 3 21.0 NA NA NA f

关于r - 设置所有相同的值 NA、groupwise 和 colwise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44135631/

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