【问题标题】:How to complete missing values with Na in a list?如何在列表中用 Na 补全缺失值?
【发布时间】:2016-01-04 17:22:11
【问题描述】:

我有一个包含以下列的数据框:树 ID、月份、值。有些月份没有记录数据,因此数据框中不存在这些月份。我已经完成了缺少月份的列表,但现在我不知道如何在添加月份的值列中插入 NA。

例子:

Tree.Id:1、2、3、4、5、6、7、8、9、10 月份:一月、二月、三月、五月、六月、七月、九月、十月、十一月、十二月 :1,0,1,1,0,2,1,1,0,2

缺少以下月份:4 月、8 月、 我用下面的代码添加了它们,现在我想在这两个增加的月份中在 value 列中引入 NA。

这是我尝试过的:

tree_ls <- list()
  for (i in unique(data$Tree.ID)){
mon1 <-  data$month[data$Tree.ID == i]  ###  extract the month for every Tree iD
mon <- min(mon1, na.rm=T):max(mon1, na.rm=T) # completes the numbers with the missing month 
dat1 <- data$value[data$Tree.ID == i]
......

在这一步之后,我不知道如何创建一个列表来为所有缺少的添加月份添加 NA,因此我将拥有相同长度的列表。

谢谢

【问题讨论】:

  • 如果您能提供一个最小的可重现示例来解决您的问题,那就太好了。我们可以从中工作并使用它来向您展示如何回答您的问题。这样,将来其他人也可以适合您的问题以及随附的答案。您可以查看this SO post,了解如何在 R 中制作出色的可重现示例。
  • 我很确定您可以通过合并/连接操作实现您的实际目标。

标签: r na


【解决方案1】:

这是一篇旧帖子,但我对此有一个很好的解决方案:

首先,您的可重现的小代码应该如下:

month <- c(Jan, Feb, Mar, May, Jun, Jul, Sept, Oct, Nov, Dec)
value <- c(1,0,1,1,0,2,1,1,0,2)
df <- data.frame(id=id, month=month,value=value)
> head(df)
  id month value
1  1   Jan     1
2  2   Feb     0
3  3   Mar     1
4  4   May     1
5  5   Jun     0
6  6   Jul     2

现在只需简单地介绍您的域的完整列表,例如,您希望获得 NA 的月份。

completeMonths <- c("Jan", "Feb", "Mar", "Apr","May", "Jun", "Jul","Aug", "Sept", "Oct", "Nov", "Dec")
df2 <- dataframe(month=completeMonths)
> df2
month
1    Jan
2    Feb
3    Mar
4    Apr
5    May
6    Jun
7    Jul
8    Aug
9   Sept
10   Oct
11   Nov
12   Dec

现在我们有一个包含所有基础值的列,所以当我们合并时,我们可以使用以下语法将缺失的行填充为 NA:

merge(df, df2, on=month, all=TRUE)

我们的结果如下:

   month id value
1    Dec 10     2
2    Feb  2     0
3    Jan  1     1
4    Jul  6     2
5    Jun  5     0
6    Mar  3     1
7    May  4     1
8    Nov  9     0
9    Oct  8     1
10  Sept  7     1
11   Apr NA    NA
12   Aug NA    NA

希望这会有所帮助,数据争吵很糟糕。

【讨论】:

    【解决方案2】:

    当您说您有一个 data frame 的某些月份“没有记录数据”因此“不存在”时,它们在 data frame 中的事实完全意味着它们具有一定的代表性。我猜测“不存在”是指它们是空白字符串,例如""。如果是这种情况,您可以使用 dplyr 包中的 mutate 和基本包中的 ifelse 将空白字符串替换为 NA 值,如下所示:

    library(dplyr);
    data_with_nas <- mutate(data, value = ifelse(value=="", NA, value));
    

    这读作“更改datadata frame,使其value 单元格在它们是空白字符串时被替换为NA,否则保持原样。”

    【讨论】:

    • 也许,我错了,但我认为 OP 的意思是,当没有记录给定月份的数据时,该月就没有列。因此,它不仅仅是在列中用 NA 填充空白。
    • 很难说,是的。我正在处理 OP 的第一句话,“我有一个包含以下列的数据框:树 ID、月份、值”,这似乎暗示了一个 3 列 data frame,其中月份和值的列是分开的。我的猜测可能是错误的。在这种情况下,OP 必须提供数据供我们使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 2018-08-14
    • 2020-08-11
    • 1970-01-01
    • 2013-07-08
    相关资源
    最近更新 更多