【问题标题】:Fill down every other row with level above in tidyverse在 tidyverse 中每隔一行填写上面的级别
【发布时间】:2019-03-04 15:03:29
【问题描述】:

我正在学习 R,但遇到了 tidry 和 dplyr 的障碍。

我在 R 中有一个数据框,其中第一列是一个因子,每隔一行只有一个级别。我正在尝试弄清楚如何使用 tidyverse 工具来填写。

我尝试过使用填充和替换,但似乎都不起作用。

td <- data.frame("State" = c("NY", "", "OH", ""), "Your" = c(101:104), "Name" = c(5:8))

td
State    Your    Name
<fctr>   <int>   <int>
NY       101     5      
         102     6      
OH       103     7      
         104     8  

我想要得到的是

State    Your    Name
<fctr>   <int>   <int>
NY       101     5      
NY       102     6      
OH       103     7      
OH       104     8  

使用 tidyr 或 dplyr

【问题讨论】:

  • 如果你读入的数据有空格,你可以设置na.strings=从一开始就以NA读入,例如read.csv(textConnection("a,b\nc,2\n\"\",2"), na.strings="")

标签: r dplyr tidyr


【解决方案1】:

一种选择是将空格 ("") 替换为 NA (na_if) 并使用 tidyr 中的 fill 用其前面的非 NA 相邻元素填充 NA 元素

library(tidyverse)
td %>% 
   mutate(State = na_if(State, "")) %>%
   fill(State)
#    State Your Name
#1    NY  101    5
#2    NY  102    6
#3    OH  103    7
#4    OH  104    8

或使用base R

i1 <- td$State != ""
td$State <- with(td, State[i1][cumsum(i1)])

【讨论】:

  • 太奇怪了...我可以发誓我完全使用了那个代码并且没有得到它但是它做到了!
  • @ajbentley 请检查列名中是否有大小写差异等拼写错误
【解决方案2】:

来自zoo的解决方案

library(zoo)
td[td=='']=NA
zoo::na.locf(td)
  State Your Name
1    NY  101    5
2    NY  102    6
3    OH  103    7
4    OH  104    8

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 2018-11-16
    • 1970-01-01
    相关资源
    最近更新 更多