簡體   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