【问题标题】:R Transform Data Frame and Remove NAsR 变换数据框并移除 NA
【发布时间】:2015-06-05 02:38:50
【问题描述】:

我已将 R 中的数据集从 LONG 格式转换为 WIDE 格式,现在每行有一个测量值。根据“日期”列合并行并删除 NA 的最佳方法是什么?

这是我所拥有的示例:

    Date    M1  M2  M3  M4
1   2013    NA  NA  NA  2
2   2013    6   NA  NA  NA
3   2013    NA  19  NA  NA
4   2013    NA  NA  10  NA
5   2014    NA  NA  NA  1
6   2014    NA  NA  231 NA
7   2014    NA  215 NA  NA
8   2014    16  NA  NA  NA

这就是我想要创建的:

    Date    M1  M2  M3  M4
1   2013    6   19  10  2
2   2014    16  215 231 1

任何建议或帮助将不胜感激!

【问题讨论】:

  • 你能回到你开始做数据的地方吗?从源头解决问题可能会更好。
  • 我在长数据格式上使用了 tidyr 包 spread() 函数。我基本上是这样做的:df2
  • @bridgbro 您可能需要显示原始示例,即df1 如果我尝试从显示的示例中重新创建长格式,dfN <- gather(df1, Var, Val, -Date) %>% na.omit(); spread(dfN, Var, Val) 会给出预期的结果。

标签: r transform na


【解决方案1】:

如果您每行有一个测量值:

result<-aggregate(cbind(M1=data$M1, M2=data$M2, M3=data$M3, M4=data$M4), 
                  by=list(Date= data$Date), FUN=sum, na.rm=TRUE) 

编辑 正如阿南达在 cmets 中提到的那样,这更好:

 aggregate(. ~ Date, mydf, sum, na.rm = TRUE, na.action = "na.pass")

【讨论】:

  • 或者,更一般地说,aggregate(. ~ Date, mydf, sum, na.rm = TRUE, na.action = "na.pass")
  • na.action = "na.pass" 是做什么的?
  • aggregate 的公式方法处理NA 值与基本方法不同。这有点像说保留 NA 值以供考虑(我们用 na.rmsum 覆盖)。
【解决方案2】:

在不了解您的数据集的情况下,您可以尝试以下操作:

library(data.table)
as.data.table(mydf)[, lapply(.SD, sum, na.rm = TRUE), by = Date]
#    Date M1  M2  M3 M4
# 1: 2013  6  19  10  2
# 2: 2014 16 215 231  1

它不必使用“data.table”(但这将是您最快的选择之一),但可以是您最喜欢的聚合函数之一。

【讨论】:

    【解决方案3】:

    使用dplyr

    library(dplyr)
    df1%>% 
       group_by(Date) %>%
       summarise_each(funs(sum(., na.rm=TRUE)))
    #  Date M1  M2  M3 M4
    #1 2013  6  19  10  2
    #2 2014 16 215 231  1
    

    如果每个“日期”每列只有一个非 NA 观察值,您可以将 summarise_each 步骤替换为 summarise_each(funs(na.omit(.)))

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-03-01
      • 2022-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-25
      • 2017-06-25
      相关资源
      最近更新 更多