我有一个数据集,我希望在数据框中有一定数量的观察结果
A 20
B 10
C 5
然而,在运行我的分析时,情况并非总是如此,有时我发现缺少观察结果,结果数据框看起来像这样
A 10
C 5
在这种情况下,没有关于B的观察。我想在绘图之前将0个观察结果附加到最终数据帧,以便指示缺失观察的值。
最终数据框应如下所示
A 10
B 0
C 5
如何在R中完成此操作?
答案 0 :(得分:1)
如果您将ID列(使用A,B,C)定义为factor
(这似乎合适),您可以绘制数据,甚至是那些不在数据中的因子级别(但在定义的因子中)水平)将被绘制。这是一个小例子:
df <- data.frame(ID = LETTERS[1:3], x = rnorm(3))
df
# ID x
#1 A 1.350458
#2 B 1.340855
#3 C 1.311329
subdf <- df[c(1,3),]
subdf
# ID x
#1 A 1.350458
#3 C 1.311329
with(subdf, plot(x ~ ID))
你会发现情节中也存在“B”,尽管它不在子集数据中。
答案 1 :(得分:1)
也许您可以使用“reshape2”中的melt
和dcast
执行某些操作。
这就是我的想法:
library(reshape2)
out <- dcast(
melt( # Makes a data.frame from a list
mget(ls(pattern = "df\\d")), # Collects the relevant df in a list
id.vars = "V1"), # The variable to melt by
L1 ~ V1, value.var = "value", fill = 0) # Other options for dcast
out
# L1 A B C
# 1 df1 20 10 5
# 2 df2 10 0 5
从那里,你可以回到长数据表格。
melt(out, id.vars = "L1")
# L1 variable value
# 1 df1 A 20
# 2 df2 A 10
# 3 df1 B 10
# 4 df2 B 0
# 5 df1 C 5
# 6 df2 C 5
如果需要单独的data.frame
,那么您还可以查看使用split
,但如果您要进行绘图,则此格式应该可以正常使用。
df1 <- structure(list(V1 = c("A", "B", "C"), V2 = c(20L, 10L, 5L)),
.Names = c("V1", "V2"), class = "data.frame",
row.names = c(NA, -3L))
df2 <- structure(list(V1 = c("A", "C"), V2 = c(10L, 5L)),
.Names = c("V1", "V2"), class = "data.frame",
row.names = c(NA, -2L))