【问题标题】:Fill in sequential values in a dataframe在数据框中填充顺序值
【发布时间】:2018-06-05 23:55:40
【问题描述】:

我有一个 R 数据处理问题。我在 .csv 文件中有大量数据,可以使用 readr 加载。问题是我需要添加到数据框中的缺失值。

示例数据:

X1    X2    Value
Coal  1     300
Coal  3     100
Coal  5     150
NatG  2     175
NatG  4     150

此文件将正确加载。但是,我想添加处理,以便最终数据帧包含每个 X1 类型的条目和 X2 中的整个序列 1:5,缺失值设置为零。最终的数据框是这样的:

X1    X2    Value
Coal  1     300
Coal  2     0
Coal  3     100
Coal  4     0
Coal  5     150
NatG  1     0
NatG  2     175
NatG  3     0
NatG  4     150
NatG  5     0

我尝试使用 readr 加载所有条目都为零的文件,然后将真实数据读入同一数据帧,但这是破坏性覆盖,并且删除了丢失的行。我需要知道如何在数据框中添加适当的行,而不知道 X1 下的每个值会丢失 1:5 序列中的哪些值。

【问题讨论】:

标签: r dataframe


【解决方案1】:

我们可以使用 包中的complete 函数。 complete 函数根据提供的列创建组合。 fill 参数可以指定填充值。

library(tidyr)

dt2 <- dt %>%
  complete(X1, X2, fill = list(Value = 0))
dt2
# # A tibble: 10 x 3
#       X1    X2 Value
#    <chr> <int> <dbl>
#  1  Coal     1   300
#  2  Coal     2     0
#  3  Coal     3   100
#  4  Coal     4     0
#  5  Coal     5   150
#  6  NatG     1     0
#  7  NatG     2   175
#  8  NatG     3     0
#  9  NatG     4   150
# 10  NatG     5     0

如果缺少某些组值,我们还可以指定组合的组值。例如,我们可以执行以下操作来确保 X2 列中的 1 到 5 都已被考虑。

dt2 <- dt %>%
  complete(X1, X2 = 1:5, fill = list(Value = 0))

或者使用full_seq,它将根据列中的最小值和最大值自动创建序列。

dt2 <- dt %>%
  complete(X1, X2 = full_seq(X2, period = 1), fill = list(Value = 0))

数据

dt <- read.table(text = "X1    X2    Value
Coal  1     300
                 Coal  3     100
                 Coal  5     150
                 NatG  2     175
                 NatG  4     150",
                 header = TRUE, stringsAsFactors = FALSE)

【讨论】:

    【解决方案2】:

    @www 和 tidyr 提供的出色解决方案。这是在基础 R 中执行此操作的一种方法。

    levels <- 1:5
    
    type <- c("Coal", "NatG")
    
    df2 <- expand.grid(levels,type)
    
    df3 <- merge(dt, df2, by.x=c("X1","X2"), by.y=c("Var2","Var1"),all.y=T)
    
    df3[is.na(df3)] <- 0
    
         X1 X2 Value
    1  Coal  1   300
    2  Coal  2     0
    3  Coal  3   100
    4  Coal  4     0
    5  Coal  5   150
    6  NatG  1     0
    7  NatG  2   175
    8  NatG  3     0
    9  NatG  4   150
    10 NatG  5     0
    

    【讨论】:

    • 让这些工作,但有一个小的补充。使用 [readr] 从 .csv 文件中读取数据会导致初始输入成为数据帧。我必须首先使用 [data.table] 包中的 [setDT] 将其更改为 data.table。完成此操作后,两种解决方案都有效。
    • 这里不需要data.table。您可能需要设置dt as.data.frame,仅此而已。我只是将dt 作为您的主表的名称,因为这就是您使用的名称。
    猜你喜欢
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 2016-09-07
    • 2021-10-21
    • 1970-01-01
    • 2023-03-14
    • 2020-11-29
    • 1970-01-01
    相关资源
    最近更新 更多