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

如何在R中输入完整数据集中的采样缺失数据,r,dataframe,data-manipulation,R,Dataframe,Data Manipulation,我正在使用一种抽样方法对整个数据集的700000行和5列数据进行抽样。列为,x1;x2;x3;x4;y、 在使用Matlab中的方法作为采样方法之后,我得到了大约400000个采样数据集。但问题是,该方法没有对“y”进行采样,这意味着“y”在完整的数据集中,并且与x1分离;x2;x3;x4。 几个星期以来,我试图再次找出代码,但仍然没有对“y”进行采样。因此,我必须找到另一种方法来匹配数据集,抽样方法没有随机化完整的数据集,因此它特别有序,但抽样方法删除了一些数据集。这是数据的屏幕截图 所以

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

所以上面是截图,我们可以从“完整数据集”中看到,采样的数据只需要少量数据。“完整数据集”中突出显示的蓝色是“采样”中的数据,同时“完整数据集”中的黑色文本颜色被删除,这就是为什么“采样”中完整数据集中没有黑色文本颜色的数据。从“采样”中,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")
}

你知道代码缺少哪一部分吗?

当你使用
索引
公式时,如果你给多个列作为参考数组(在你的例子中是A列到D列),你需要给列编号作为第三个参数(在你的例子中是1到4列)。因此,如果您使用以下公式,您将不会收到任何错误消息

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

我的建议是(如果可能的话),插入一个新列作为数据集的第一列,并将其命名为“记录编号”,即1到700K,每行的增量编号


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

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

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


我猜您的源数据中可能有错误。

您只是想对数据帧进行随机采样吗?这样做很容易:

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

使用这种方法所做的是创建一组从1到数据集中行数的随机数,然后从该数据集中提取20个随机数。然后,您可以将其传递回子集操作,以仅获取与这些数字匹配的行。“FALSE”表示您希望采样不进行替换,这是您想要的,除非您正在进行引导

最后我想到了这个,事情进展顺利,非常感谢您的回复

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

populationHC非常感谢您的回复,但目前工作已改为RP请参见以下问题:。由于悬赏,我们不能投票决定关闭,但这绝对是应该的。还请注意,如果X1、X2、X3和X4的组合具有多个Y值,则无法准确拉动Y@Chris,尽管你可以标记它让版主关闭:被骗者是否回答了你的问题?如果是这样的话,我会把它当作一个复制品关闭,并退还你的赏金。@RobertHarvey我已经回答了下面的问题,谢谢你,我认为“merge”对这种情况很有用,但是当我在merge.data.frame(dfsam,dfpop,by=c(“x1”,“x2”,“x3”,“x4”)中尝试函数
Error时就会发生这种情况,:不允许使用负长度向量
这是因为我的向量长度不同吗?
dfsam
有386431行,而
dfpop
有709899行。因此差异足够大
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
mtcars[sample(seq_along(mtcars[, 1]), 20, FALSE), ]
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")