[英]How would you condense a data frame into a few concise rows?
例如,假设我们有如下所示的 data.frame 'IRIS_FD_UP':
IRIS_FD_UP <- "Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 NA NA NA NA
1 NA 3.5 NA NA NA
1 NA NA 1.4 NA NA
1 NA NA NA 0.2 NA
1 NA NA NA NA setosa
2 4.6 NA NA NA NA
2 NA 3.2 NA NA NA
2 NA NA 1.5 NA NA
2 NA NA NA 0.2 NA
2 NA NA NA NA setosa
我们如何将它压缩成这样的:
IRIS_NOT_FD_UP <- "Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.6 3.2 1.5 0.2 setosa
(顺便说一句,我不关心表名:))
这是否有效:
data.frame(lapply(dat, function(x) x[!is.na(x)]))
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.6 3.2 1.5 0.2 setosa
使用的数据:
dat
# A tibble: 10 x 5
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
<dbl> <dbl> <dbl> <dbl> <chr>
1 5.1 NA NA NA NA
2 NA 3.5 NA NA NA
3 NA NA 1.4 NA NA
4 NA NA NA 0.2 NA
5 NA NA NA NA setosa
6 4.6 NA NA NA NA
7 NA 3.2 NA NA NA
8 NA NA 1.5 NA NA
9 NA NA NA 0.2 NA
10 NA NA NA NA setosa
我假设您的意思不是“冷凝”,而是“删除 NA”。
函数is.na()
可以帮助你。 在您的情况下,它将是:
IRIS_FD_UP[!is.na(IRIS_FD_UP)]
请让我知道如果我误解了什么。
看起来不是替换 NA 值并删除或过滤它们,而是希望用最后出现的非空值填充这些值。 我会确保你有充分的理由这样做。
您可以为此使用tidyr
包。 我创建了一些虚拟数据来测试:
dat<-head(as_tibble(iris))
dat<-dat %>%mutate(Sepal.Length = ifelse(Sepal.Length<5,NA,Sepal.Length), Sepal.Width = ifelse(Sepal.Width<3.1, NA,Sepal.Width), Petal.Width=ifelse(Petal.Width==0.2,NA,Petal.Width))
dat["Species"][c(1:3),]=NA
# A tibble: 6 x 5
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
<dbl> <dbl> <dbl> <dbl> <fct>
1 5.1 3.5 1.4 NA NA
2 NA NA 1.4 NA NA
3 NA 3.2 1.3 NA NA
4 NA 3.1 1.5 NA setosa
5 5 3.6 1.4 NA setosa
6 5.4 3.9 1.7 0.4 setosa
dat %>% fill(everything(), .direction = "up")
然后给你这个:
# A tibble: 6 x 5
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
<dbl> <dbl> <dbl> <dbl> <fct>
1 5.1 3.5 1.4 0.4 setosa
2 5 3.2 1.4 0.4 setosa
3 5 3.2 1.3 0.4 setosa
4 5 3.1 1.5 0.4 setosa
5 5 3.6 1.4 0.4 setosa
6 5.4 3.9 1.7 0.4 setosa
这是我之前基于跨多列过滤 NA 的答案:
该tidyverse方式是使用across
适用于所有列。 https://dplyr.tidyverse.org/articles/colwise.html
iris%>% filter(across(everything(), ~ !is.na(.x)))
您可以使用具有 NA 的 starwars 的内置数据对此进行测试:
data(starwars)
# A tibble: 87 x 14
name height mass hair_color skin_color eye_color birth_year sex gender homeworld species films vehicles starships
<chr> <int> <dbl> <chr> <chr> <chr> <dbl> <chr> <chr> <chr> <chr> <list> <list> <list>
1 Luke Sky~ 172 77 blond fair blue 19 male mascu~ Tatooine Human <chr ~ <chr [2~ <chr [2]>
2 C-3PO 167 75 NA gold yellow 112 none mascu~ Tatooine Droid <chr ~ <chr [0~ <chr [0]>
3 R2-D2 96 32 NA white, blue red 33 none mascu~ Naboo Droid <chr ~ <chr [0~ <chr [0]>
4 Darth Va~ 202 136 none white yellow 41.9 male mascu~ Tatooine Human <chr ~ <chr [0~ <chr [1]>
5 Leia Org~ 150 49 brown light brown 19 female femin~ Alderaan Human <chr ~ <chr [1~ <chr [0]>
6 Owen Lars 178 120 brown, grey light blue 52 male mascu~ Tatooine Human <chr ~ <chr [0~ <chr [0]>
7 Beru Whi~ 165 75 brown light blue 47 female femin~ Tatooine Human <chr ~ <chr [0~ <chr [0]>
8 R5-D4 97 32 NA white, red red NA none mascu~ Tatooine Droid <chr ~ <chr [0~ <chr [0]>
9 Biggs Da~ 183 84 black light brown 24 male mascu~ Tatooine Human <chr ~ <chr [0~ <chr [1]>
10 Obi-Wan ~ 182 77 auburn, wh~ fair blue-gray 57 male mascu~ Stewjon Human <chr ~ <chr [1~ <chr [5]>
# ... with 77 more rows
starwars%>% filter(across(everything(), ~ !is.na(.x)))
# A tibble: 29 x 14
name height mass hair_color skin_color eye_color birth_year sex gender homeworld species films vehicles starships
<chr> <int> <dbl> <chr> <chr> <chr> <dbl> <chr> <chr> <chr> <chr> <list> <list> <list>
1 Luke Skyw~ 172 77 blond fair blue 19 male mascu~ Tatooine Human <chr ~ <chr [2~ <chr [2]>
2 Darth Vad~ 202 136 none white yellow 41.9 male mascu~ Tatooine Human <chr ~ <chr [0~ <chr [1]>
3 Leia Orga~ 150 49 brown light brown 19 female femin~ Alderaan Human <chr ~ <chr [1~ <chr [0]>
4 Owen Lars 178 120 brown, grey light blue 52 male mascu~ Tatooine Human <chr ~ <chr [0~ <chr [0]>
5 Beru Whit~ 165 75 brown light blue 47 female femin~ Tatooine Human <chr ~ <chr [0~ <chr [0]>
6 Biggs Dar~ 183 84 black light brown 24 male mascu~ Tatooine Human <chr ~ <chr [0~ <chr [1]>
7 Obi-Wan K~ 182 77 auburn, wh~ fair blue-gray 57 male mascu~ Stewjon Human <chr ~ <chr [1~ <chr [5]>
8 Anakin Sk~ 188 84 blond fair blue 41.9 male mascu~ Tatooine Human <chr ~ <chr [2~ <chr [3]>
9 Chewbacca 228 112 brown unknown blue 200 male mascu~ Kashyyyk Wookiee <chr ~ <chr [1~ <chr [2]>
10 Han Solo 180 80 brown fair brown 29 male mascu~ Corellia Human <chr ~ <chr [0~ <chr [2]>
# ... with 19 more rows
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.