繁体   English   中英

有选择地删除R数据框中的列值

[英]Selectively Remove Column Values in R Data Frame

假设在著名的iris数据集中,我确定当Sepal.Length> 5.0时,我的测量设备出现错误。

在这个人为的示例中,我想保留Sepal.Length列的原始值,但是如果该行的Sepal.Length> 5.0,则将其余列更改为NA

例如,这是:

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

会变成这样:

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         NA           NA          NA   NA
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         NA           1.7         NA   NA

我可以确定通过矢量化手动完成此操作。 类似于以下内容:

iris$Sepal.Width <- ifelse(iris$Sepal.Length > 5.0, NA, iris$Sepal.Width)

但是,在这种方法中,我需要手动指定每一列。

我强烈怀疑有一种巧妙的方法可以通过purrrdplyr解决此dplyr 不过,我已经modify_at pmap / modify_at兔子洞中了。 任何有关优雅的建议将不胜感激。

谢谢!

library(data.table)

dt <- copy(iris)
setDT(dt)

dt[Sepal.Length > 5.0, (which(!names(dt) == "Sepal.Length")) := NA]
#      Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#   1:          5.1          NA           NA          NA      NA
#   2:          4.9         3.0          1.4         0.2  setosa
#   3:          4.7         3.2          1.3         0.2  setosa
#   4:          4.6         3.1          1.5         0.2  setosa
#   5:          5.0         3.6          1.4         0.2  setosa
#  ---                                                          
# 146:          6.7          NA           NA          NA      NA
# 147:          6.3          NA           NA          NA      NA
# 148:          6.5          NA           NA          NA      NA
# 149:          6.2          NA           NA          NA      NA
# 150:          5.9          NA           NA          NA      NA

另一种方法是简单地使用它(仅当您对第二列开始的所有列都感兴趣时,这才是方便的)

iris[iris$Sepal.Length > 5.0, 2:ncol(iris)] <- NA

# And the output for first six rows

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1          NA           NA          NA    <NA>
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4          NA           NA          NA    <NA>

听起来这对您有用

my_clip <- function(x, z) ifelse(z>5, NA, x)
iris %>% mutate_at(vars(-Sepal.Length), my_clip, z=.$Sepal.Length)

#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1          5.1          NA           NA          NA      NA
# 2          4.9         3.0          1.4         0.2       1
# 3          4.7         3.2          1.3         0.2       1
# 4          4.6         3.1          1.5         0.2       1
# 5          5.0         3.6          1.4         0.2       1
# 6          5.4          NA           NA          NA      NA

我们使用mutate_at来获取要转换的所有列,然后由于您无法在mutate_at函数中轻松引用其他列,因此我们需要使用.$语法将threshold列作为单独的参数传递。

由于您要求的是一个purrr示例,因此请继续。 虽然我更喜欢已经提出的data.table答案:

library(purrr)
library(tidyr)

iris %>% nest(-Sepal.Length) %>% 
mutate(data = ifelse(Sepal.Length > 5.0, 
                   map(data, function(x) x*NA), data)) %>% 
unnest

使用magrittr您可以执行以下操作:

library(magrittr)
iris %>% head %>% inset(.$Sepal.Length > 5,-1,NA)

或使用基数R代替magrittr (相同的输出,只是功能更丑陋:),并且管道仍然需要magrittrdplyr ):

iris %>% head %>% `[<-`(.$Sepal.Length > 5,-1,NA)

-1是要保留的列的索引,取反。

结果

#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1          5.1          NA           NA          NA    <NA>
# 2          4.9         3.0          1.4         0.2  setosa
# 3          4.7         3.2          1.3         0.2  setosa
# 4          4.6         3.1          1.5         0.2  setosa
# 5          5.0         3.6          1.4         0.2  setosa
# 6          5.4          NA           NA          NA    <NA>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM