我正在使用抽样方法来获取完整数据集的大约700000行和5列的数据。列是x1; x2; x3; x4;年。
在Matlab中使用该方法进行采样方法后,得到了大约400000个采样数据集。但问题是,该方法没有采样“y”,这意味着“y”在完整数据集中并与x1; x2; x3; x4分开。
几个星期以来,我试图再次找出代码,仍然没有采样“y”。因此,我必须找到匹配数据集的另一种方法,采样方法没有随机化整个数据集,所以它特别有序,但采样方法删除了一些数据集。这是数据的屏幕截图
所以上面是截图,我们可以看到,从“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
您是否知道缺少哪部分代码?
答案 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")