R 将0附加到数据帧中缺少的观测值。

R 将0附加到数据帧中缺少的观测值。,r,dataframe,R,Dataframe,我有一个数据集,我期望在一个数据框中有固定数量的观测值 A 20 B 10 C 5 然而,在运行我的分析时,情况并非总是如此,有时我会发现缺少的观察结果,结果数据框如下所示 A 10 C 5 A 10 B 0 C 5 在这种情况下,B没有观测值。在绘图之前,我希望在最终数据帧中附加0个观测值,以指示缺失观测值的值 最终的数据帧应该是这样的 A 10 C 5 A 10 B 0 C 5 我怎样才能在R中实现这一点 如果您将ID列(A、B、C)定义为因子,这在这里似乎是合适的,那么您可以

我有一个数据集,我期望在一个数据框中有固定数量的观测值

A 20
B 10
C 5
然而,在运行我的分析时,情况并非总是如此,有时我会发现缺少的观察结果,结果数据框如下所示

A 10
C 5 
A 10
B 0
C 5
在这种情况下,B没有观测值。在绘图之前,我希望在最终数据帧中附加0个观测值,以指示缺失观测值的值

最终的数据帧应该是这样的

A 10
C 5 
A 10
B 0
C 5

我怎样才能在R中实现这一点

如果您将ID列(A、B、C)定义为
因子,这在这里似乎是合适的,那么您可以绘制数据,甚至可以绘制不在数据中(但在定义的因子水平中)的因子水平。下面是一个小例子:

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))

df也许你可以用“重塑2”中的
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
如果需要单独的
data.frame
s,那么您也可以使用
split
,但是如果您只是要打印,这种格式应该可以正常工作


样本数据
df1如何创建此数据集?这是一个只有两列的data.frame吗?第一列总是大写英文字母吗?换句话说,您如何知道缺少哪些级别?如果您可以发布您正在使用的实际代码,这将非常有用,因为我们可以指出,如果(is.na(the_answer_for_B))final_dataframe$B@roman我有一个创建此数据集的外部进程,您可以在哪里添加一行代码,如
。第一列中的观察顺序可能不同,也就是说,它不一定是B C,而可以是B C A。考虑把你的评论中的所有信息加入到文章中来改进你的问题。但假设原始data.frame没有关于冗余因子级别的信息。这就是我询问信息生成方式的原因。也许它可以从源头上解决(用你的逻辑)。没错,@RomanLuštrik。也许问题不是很精确,原始数据框架是否包含有关因子水平的信息。我将“我期望有固定数量的观察结果”解释为因子水平是已知的,但可能事实并非如此。OP应该澄清这一点。数据是由一个外部程序生成的,我用R来读取它。因此,原始数据没有@Roman所说的冗余因子水平的信息。@eastafri,在这种情况下,我的答案将不起作用。但你还没有回答大卫评论中提到的你如何知道哪些级别缺失(或不缺失)的问题。我知道,因为我预计在所有情况下都是B和C。如果没有B,则外部过程不包括它。为了绘图,我想显示没有B,因此我想将B“注入”到数据框中,并在第二列中为其赋值0。我认为它可能包括扫描第一列,如果我检测到缺少B,那么添加一个值为0的新观察值B。我应该对所有缺少观察的情况都这样做。只是不知道如何在R中有效地处理这个问题