【问题标题】:use pivot_longer and pivot_wider in combination结合使用 pivot_longer 和 pivot_wider
【发布时间】:2021-10-04 11:31:08
【问题描述】:

我有一个数据框,在各个列中有很多 NaN

df <- data.frame(
  Data1 = c(3,2,1,NaN, NaN, NaN),
  Data2  = c(NaN, NaN, NaN, 3,5,3),
  Data3 = c(NaN, NaN, 7,5,1, NaN)
)

我正在尝试通过在 NaNvalues 上使用 pivot_longerfiltering 并使用 pivot_wider 将正数再次放回其原始列中来摆脱 NaN 值,这,但是失败了:

library(tidyr)
df %>%
  pivot_longer(c("Data1","Data2","Data3")) %>%
  filter(!is.na(value)) %>%
  pivot_wider(names_from = name,
              values_from = value)
# A tibble: 1 x 3
  Data1     Data3     Data2    
  <list>    <list>    <list>   
1 <dbl [3]> <dbl [3]> <dbl [3]>
Warning message:
Values are not uniquely identified; output will contain list-cols.
* Use `values_fn = list` to suppress this warning.
* Use `values_fn = length` to identify where the duplicates arise
* Use `values_fn = {summary_fun}` to summarise duplicates 

代码有什么问题,如何实现这个输出?

  Data1 Data2 Data3
      3     3     7
      2     5     5
      1     3     1

【问题讨论】:

    标签: r tidyr


    【解决方案1】:

    使用purrr 可以巧妙地解决这个特殊问题:

    map_dfr(df, na.omit)
    
      Data1 Data2 Data3
      <dbl> <dbl> <dbl>
    1     3     3     7
    2     2     5     5
    3     1     3     1
    

    【讨论】:

      【解决方案2】:

      代码不一定会失败,但会返回警告,因为每个单元格中有多个值。如果每列中的值数量相同,您可以unnest 列表输出。

      library(dplyr)
      library(tidyr)
      
      df %>%
        pivot_longer(starts_with('Data'), values_drop_na = TRUE) %>%
        arrange(name) %>%
        pivot_wider(names_from = name,values_from = value, values_fn = list) %>%
        unnest()
      
      #  Data1 Data2 Data3
      #  <dbl> <dbl> <dbl>
      #1     3     3     7
      #2     2     5     5
      #3     1     3     1
      

      【讨论】:

        【解决方案3】:

        基础 R:

        我更喜欢sapplyna.omit

        sapply(df, na.omit)
        

        输出:

          Data1 Data2 Data3
          <dbl> <dbl> <dbl>
        1     3     3     7
        2     2     5     5
        3     1     3     1
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-19
          • 2020-09-17
          • 1970-01-01
          • 1970-01-01
          • 2022-07-29
          相关资源
          最近更新 更多