繁体   English   中英

您如何将数据框压缩为几个简洁的行?

[英]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.

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