我有一個混合數字刻度值和其他連續值的 data.frame。但是,缺失資料由以下值 -1 和 8 表示。這是一個示例:
df = data.frame(Name = c('George','Andrea', 'Micheal','Maggie','Ravi','Xien','Jalpa'),
Grade_score=c(4,6,2,9,5,7,8),
Mathematics1_score=c(45,78,44,89,66,49,72),
Science_score=c(-1,52,45,88,-1,90,47),
Science_scale=c(-1,5,5,8,3,0,7))
我想從整個 data.frame 中洗掉任何包含任何缺失資料的行。我可以逐列進行,但我有超過 25 列。
df2<-subset(df, df$x1 !="-1")
uj5u.com熱心網友回復:
一個使用 base R 的 one liner:
df[apply(df[,-1],1, \(x) !any(x %in% c(-1,8))),]
或者,您可以轉換為NA
并使用na.omit()
library(dplyr)
df %>%
mutate(across(-Name, ~if_else(.x %in% c(-1,8),NA_real_,.x))) %>%
na.omit()
輸出:
Name Grade_score Mathematics1_score Science_score Science_scale
<char> <num> <num> <num> <num>
1: Andrea 6 78 52 5
2: Micheal 2 44 45 5
3: Xien 7 49 90 0
uj5u.com熱心網友回復:
library(tidyverse)
df %>%
filter(if_all(everything(), ~ !(.x %in% c(-1, 8))))
# A tibble: 3 × 5
Name Grade_score Mathematics1_score Science_score Science_scale
<chr> <dbl> <dbl> <dbl> <dbl>
1 Andrea 6 78 52 5
2 Micheal 2 44 45 5
3 Xien 7 49 90 0
uj5u.com熱心網友回復:
基礎R
df[rowSums(sapply(df, `%in%`, c(-1, 8))) < 1,]
# Name Grade_score Mathematics1_score Science_score Science_scale
# 2 Andrea 6 78 52 5
# 3 Micheal 2 44 45 5
# 6 Xien 7 49 90 0
dplyr
(雖然 TomHoel 的回答也顯示了這一點,在我開始起草后進行了編輯,但由于我在筆記中討論了多種標準,我將保留它。)
library(dplyr)
df %>%
filter(if_all(everything(), ~ !. %in% c(-1, 8)))
# Name Grade_score Mathematics1_score Science_score Science_scale
# 1 Andrea 6 78 52 5
# 2 Micheal 2 44 45 5
# 3 Xien 7 49 90 0
注意:如果Grade_score
不應該為8
值過濾掉該列(因為這似乎與其他列具有相同的比例),那么我們可以拆分邏輯:
df %>%
filter(
if_all(-Grade_score, ~ !. %in% c(-1, 8)),
Grade_score != -1
)
# Name Grade_score Mathematics1_score Science_score Science_scale
# 1 Andrea 6 78 52 5
# 2 Micheal 2 44 45 5
# 3 Xien 7 49 90 0
# 4 Jalpa 8 72 47 7
如果你有多個這樣的列,那么我們可以做
df %>%
filter(
if_all(-c(Grade_score, Science_scale), ~ !. %in% c(-1, 8)),
if_all(c(Grade_score, Science_scale), ~ . != -1)
)
# Name Grade_score Mathematics1_score Science_score Science_scale
# 1 Andrea 6 78 52 5
# 2 Micheal 2 44 45 5
# 3 Maggie 9 89 88 8
# 4 Xien 7 49 90 0
# 5 Jalpa 8 72 47 7
和基礎 R 變體,保留使用`%in%`
只是為了方便。
df[rowSums(cbind(
sapply(df[,-c(1:2, 5)], `%in%`, c(-1, 8)),
sapply(df[,c(1:2, 5)], `%in%`, -1))) < 1,]
# Name Grade_score Mathematics1_score Science_score Science_scale
# 2 Andrea 6 78 52 5
# 3 Micheal 2 44 45 5
# 4 Maggie 9 89 88 8
# 6 Xien 7 49 90 0
# 7 Jalpa 8 72 47 7
uj5u.com熱心網友回復:
這是基本 R 的另一個選項。我們可以用 NA 替換完整資料集所需的值,然后用 NA 省略所有行。
na.omit(replace(df, df ==-1 | df == 8, NA))
#> Name Grade_score Mathematics1_score Science_score Science_scale
#> 2 Andrea 6 78 52 5
#> 3 Micheal 2 44 45 5
#> 6 Xien 7 49 90 0
uj5u.com熱心網友回復:
當使用apply
字符和/或數字幀中的字符轉換時要小心,因為它可能會引入前導/尾隨空格(應用期望并轉換為只能容納一種資料類/型別的矩陣)。
自從
apply(df, 2, function(x) grep(8, x, value = T))
$Name
character(0)
$Grade_score
[1] "8"
$Mathematics1_score
[1] "78" "89"
$Science_score
[1] "88"
$Science_scale
[1] " 8" # <-------- " 8" will make direct comparisons FALSE
要么使用trimws
df[!apply(df, 1, function(x) any(trimws(x) %in% c(-1, 8))), ]
Name Grade_score Mathematics1_score Science_score Science_scale
2 Andrea 6 78 52 5
3 Micheal 2 44 45 5
6 Xien 7 49 90 0
或使用,如其他答案所指出的,apply
沒有字符列(在某些情況下可能很難找到/看到/知道!)sapply
/lapply
或類似的庫dplyr
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/536368.html
標籤:r
上一篇:你聽說過OTA嗎?
下一篇:為什么我的圖中省略了負值的冪?