如何从R中的完整数据集输入采样的缺失数据

时间:2016-04-13 09:25:25

标签: r dataframe data-manipulation

我正在使用抽样方法来获取完整数据集的大约700000行和5列的数据。列是x1; x2; x3; x4;年。
在Matlab中使用该方法进行采样方法后,得到了大约400000个采样数据集。但问题是,该方法没有采样“y”,这意味着“y”在完整数据集中并与x1; x2; x3; x4分开。 几个星期以来,我试图再次找出代码,仍然没有采样“y”。因此,我必须找到匹配数据集的另一种方法,采样方法没有随机化整个数据集,所以它特别有序,但采样方法删除了一些数据集。这是数据的屏幕截图

Full Dataset and Sampled

所以上面是截图,我们可以看到,从“FULL DATASET”,Sampled只需要一些数据。 “FULL DATASET”中突出显示的蓝色是“Sampled”中的数据,同时“FULL DATASET”中的黑色文本颜色被删除,这就是为什么“Sampled”中的Full数据集中没有黑色文本颜色的数据。从“采样”中Y缺失,我可以手动填写,但由于采样数据有大约400000个数据集,因此需要很长时间。 那么如何从使用R数据帧采样的“完整数据集”中填写“采样”中的“Y”?

更新

     inputdata <- function(pop,sam) 
  {

  dfpop <- data.frame(pop)
  dfsam <- data.frame(sam)
  ndfpop = nrow(dfpop)
  ndfsam = nrow(dfsam)

  for ( i in 1:ndfsam) {
    if( dfsam[i,1] == dfpop[i,1] && dfsam[i,2] == dfpop[i,2] && dfsam[i,3] == dfpop[i,3] && dfsam[i,4] == dfpop[i,4] ) {
      completesam<- print(dfpop[i,5] == dfsam[i,5])
    }
  }
write.csv(completesam, file = "D://completesampling.csv")
}

以前我在这种情况下使用Excel,但由于工作更喜欢R,我使用R代替。函数在整个行中都返回FALSE,并且我在IF

中放置了多个表达式
[1] FALSE
[1] FALSE
[1] FALSE
[1] FALSE
[1] FALSE
[1] FALSE
[1] FALSE
[1] FALSE
[1] FALSE
[1] FALSE

您是否知道缺少哪部分代码?

4 个答案:

答案 0 :(得分:3)

如果您知道每个组合都是唯一的(在x1,x2,x3,x4之间),我建议使用merge

data.frame <- merge(dfsam, dfpop, by = c("x1", "x2", "x3", "x4"), all = F)

当其他4个列值匹配时,此代码应添加Y列。

[编辑]

我写了数据的开头,看看合并是否真的有效。

dfpop = data.frame(x1 = c(4, 3, 0, 2, 1, 4, 2, 0, 3, 0, 0, 2, 0, 0, 3, 0, 2, 0, 4, 0, 2, 1, 0), 
             x2 = c(7500, 14600,  5700,  7500,  7800,  7500,  7500,  6648,  7886,  6858,
                    8077,  7600,  8077,  8077,  7500,  8077, 14600, 7600,  3500, 14172, 
                    7600,  7500,  7500), 
             x3 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
             x4 = c(1, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 1),
             y = c(0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1))


dfsam = dfpop[c(5,17,23),c("x1", "x2", "x3", "x4")] # 3 highlighted lines without y column

df = merge(dfsam, dfpop, by = c("x1", "x2", "x3", "x4")) # merging the 2 data.frames

> print(df)
  x1    x2 x3 x4 y
1  0  7500  0  1 1
2  1  7800  0  1 1
3  2 14600  0  1 1

如您所见,y列已正确添加到dfsam data.frame。 不同长度的载体没有问题。

我猜您可能在源数据中出错。

答案 1 :(得分:2)

当您使用INDEX公式时,如果您将多列作为参考数组(在您的情况下为A列到D列),则需要将列号作为第三个参数(在您的情况下为1到4) 。因此,如果您使用以下公式,您将不会收到任何错误消息。

=INDEX($A$3:$D$500002,MATCH($E$3,E3:$E$500002,0),1)

但是使用您的MATCH公式,您每次都会获得第3行作为返回值。因此,您将使用此公式组合获得相同的值。您需要在数组$E$3中比较值,而不是E3:$E$500002。但是,您还需要在查找数组中使用唯一值进行比较,因为这些查找公式会返回它们在数组中找到的第一个值。因此,如果存在重复,您将无法找到第二个值。

我建议(如果可能),插入一个新列作为数据集的第一列,并将其命名为&#34;记录号&#34;它是1到700K,每行的增量数。

比在右侧,您可以使用查找公式返回第6列(Y)值。

答案 2 :(得分:-1)

您是否只是想随机抽取数据帧?用这样的东西很容易做到:

mtcars[sample(seq_along(mtcars[, 1]), 20, FALSE), ]

您使用此方法执行的操作是创建从1到数据集中行数的随机数字集,然后从该数据集中获取20个随机数。然后,您可以将其传递回子集操作,以获得与这些数字匹配的行。 &#34; FALSE&#34;表示您希望在没有替换的情况下进行采样,这是您想要的,除非您正在进行自举。

答案 3 :(得分:-1)

最后我想出了这个,事情顺利,非常感谢你的所有回复

populationHC <- read.csv("E:/populationHC.csv")
sampledHC <- read.csv("E:/sampledHC.csv")

nsampled = dim(sampledHC)[1]
npopulation = dim(populationHC)[1]

for (i in 1:nsampled)
{
  j = 1
  check = 0
  while (check < 4)
  {
    j = j+1
    if (sampledHC[i,1]==populationHC[j,1]){check1=1}else{check1=0}
    if (sampledHC[i,2]==populationHC[j,2]){check2=1}else{check2=0}
    if (sampledHC[i,3]==populationHC[j,3]){check3=1}else{check3=0}
    if (sampledHC[i,4]==populationHC[j,4]){check4=1}else{check4=0}
    check = check1 + check2 + check3 + check4
  }
  sampledHC[i,5]=populationHC[j,5]
  print(paste('Sampled data -',i))
}

write.csv(sampledHC, "E:/HCsampled.csv")