我有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序列中的哪些值。
答案 0 :(得分:5)
我们可以使用tidyr包中的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)
答案 1 :(得分: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