【问题标题】:R: summarise a dataframe with NAN in columnsR:用 NAN 在列中汇总数据框
【发布时间】:2021-11-24 18:47:09
【问题描述】:

我有以下数据集:

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

我想总结一下:

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

我正在尝试创建一个行号,按行号分组并应用summarise,但它只是用 0 填充 NaN。

data = data %>% 
  mutate(row = row_number()) %>% 
  dplyr::group_by(row) %>% 
  dplyr::summarise(across(c("Data1","Data2","Data3"), ~sum(., na.rm=T))) %>% 
  distinct(.)

【问题讨论】:

  • 请提供您输入数据的可重现示例。
  • 上面的数据集是我输入数据的一个片段。
  • 请使用dput添加数据。你有NAN作为文本还是R中的值NaN。使用dput 添加数据将阐明数据的显示方式不清楚。
  • @MustardRecord 上面的数据集不能直接reproducible

标签: r summarize


【解决方案1】:

如果您只想计算sums,那么这样做:

data %>% 
  summarise(across(c("Data1","Data2","Data3"), ~sum(., na.rm=T)))

编辑

您可以通过使用pivot_longerpivot_wider 的组合来摆脱NaN值:

data %>%
  pivot_longer(starts_with('Data'), values_drop_na = TRUE) %>%
  arrange(name) %>%
  pivot_wider(names_from = name, values_from = value, values_fn = list) %>%
  unnest()
# A tibble: 3 x 3
  Data1 Data2 Data3
  <dbl> <dbl> <dbl>
1     3     3     7
2     2     5     5
3     1     3     1

或者更好:

library(purrr)
map_dfr(df, na.omit)

【讨论】:

  • 我试过了,但它只将 NAN 替换为 0
  • 但这不是可以接受的吗? NaN 代表:不是数字。
  • 我正在寻找的结构是压缩数据集,用 NaN 去掉所有单元格,只保留带有数据的单元格。每列具有相同数量的包含数据的单元格和包含 NAN 的单元格,因此列之间的大小应匹配
  • 我已经编辑了解决方案。现在可以用了吗?
  • 我已经实现了上面的其他解决方案,但非常感谢!
【解决方案2】:

如果您在每列中有相同数量的NaN,如示例所示,您可以使用na.omit 删除这些值。

library(dplyr)

df %>% summarise(across(.fns = na.omit))
#If in your data values are string 'NAN' then use the below
#df %>% summarise(across(.fns = ~.x[.x!= 'NAN']))

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

在基础 R 中 -

as.data.frame(sapply(df, na.omit))

数据

如果您在reproducible format 中提供数据会更容易提供帮助

df <- structure(list(Data1 = c(3, 2, 3, NaN, NaN, NaN, NaN, NaN, NaN
), Data2 = c(NaN, NaN, NaN, 3, 5, 3, NaN, NaN, NaN), Data3 = c(NaN, 
NaN, NaN, NaN, NaN, NaN, 7, 5, 1)), row.names = c(NA, -9L), class = "data.frame")

【讨论】:

  • 在我的数据中,NaN 不是字符串,所以它们实际上是“不是数字”。效果很好!谢谢!
猜你喜欢
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
  • 2017-10-26
  • 2021-10-13
  • 2017-12-31
  • 1970-01-01
相关资源
最近更新 更多