[英]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)
但是,在這種方法中,我需要手動指定每一列。
題
我強烈懷疑有一種巧妙的方法可以通過purrr
或dplyr
解決此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
(相同的輸出,只是功能更丑陋:),並且管道仍然需要magrittr
或dplyr
):
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.