在数据框中填写连续值

问题描述 投票:4回答:2

我有一个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
2个回答
5
投票

我们可以使用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
© www.soinside.com 2019 - 2024. All rights reserved.