数据帧在 r 中的 for 循环中被覆盖
dataframe overridden within for-loop in r
我的数据集包含来自数据集的百万个观测值,我正在获取 10000 个观测值。这是数据集文件的 link:dataset file link
itemRatingData = itemRatingData[1:10000,]
#V2 is user ID, V1 is item ID, V3 is item rating from use
library(plyr)
countUser = count(itemRatingData, vars = "V2")
#counted the total obeservation per user in dataset
list_of_total_Users = as.list(countUser$V2)
#taking out total number of users as a list
我接下来要做的是提取那些至少对 10 个项目进行评分的用户观察,我成功地做到了。现在我有这样的用户,他们对 50、100 和 1000 多个项目进行了评分,但我只需要至少对 10 多个项目进行评分的用户进行 10 次观察。我做了想到的事情以获得预期的结果:
for (i in 1:length(list_of_total_Users)) {
occurencePerID = subset(itemRatingData,
itemRatingData$V2%in%list_of_total_Users[[i]])
countOccurencePerID = count(occurencePerID, vars = "V2")
if(countOccurencePerID$freq >= 10){
newItemRatingData = occurencePerID[1:10,]
}
}
在这段代码中,我对每个用户 ID 的总观察结果进行了子集化,然后对它们进行了计数。如果用户 ID 频率 >= 10,则提取前 10 个观察值。现在我面临的问题是每次循环迭代都会覆盖 newItemRatingData。
即使没有数据我无法重现您的问题,但您似乎在每次迭代中都替换了 newItemRatingData
中的结果。如果您使用 cbind()
,您可以将您的行附加到 newItemRatingData
而无需替换已经存在的行
newItemRatingData = data.frame()
for (i in 1:length(list_of_total_Users)) {
occurencePerID = subset(itemRatingData,
itemRatingData$V2%in%list_of_total_Users[[i]])
countOccurencePerID = count(occurencePerID, vars = "V2")
if(countOccurencePerID$freq >= 10){
newItemRatingData = cbind(newItemRatingData,occurencePerID[1:10,])
}
}
我已经解决了我的问题,解决方案是:
newItemRatingData = data.frame("V2" = numeric(0), "V1" = numeric(0), "V3" = integer(0))
for (i in 1:length(list_of_total_Users)) {
occurencePerID = subset(itemRatingData, itemRatingData$V2%in%list_of_total_Users[[i]])
countOccurencePerID = count(occurencePerID, vars = "V2")
if(countOccurencePerID$freq >= 10){
newItemRatingData = rbind(newItemRatingData,occurencePerID[1:10,])
}
}
至于@fino 的回答是绑定列数据框。我发现按行绑定数据框的解决方案
我的数据集包含来自数据集的百万个观测值,我正在获取 10000 个观测值。这是数据集文件的 link:dataset file link
itemRatingData = itemRatingData[1:10000,]
#V2 is user ID, V1 is item ID, V3 is item rating from use
library(plyr)
countUser = count(itemRatingData, vars = "V2")
#counted the total obeservation per user in dataset
list_of_total_Users = as.list(countUser$V2)
#taking out total number of users as a list
我接下来要做的是提取那些至少对 10 个项目进行评分的用户观察,我成功地做到了。现在我有这样的用户,他们对 50、100 和 1000 多个项目进行了评分,但我只需要至少对 10 多个项目进行评分的用户进行 10 次观察。我做了想到的事情以获得预期的结果:
for (i in 1:length(list_of_total_Users)) {
occurencePerID = subset(itemRatingData,
itemRatingData$V2%in%list_of_total_Users[[i]])
countOccurencePerID = count(occurencePerID, vars = "V2")
if(countOccurencePerID$freq >= 10){
newItemRatingData = occurencePerID[1:10,]
}
}
在这段代码中,我对每个用户 ID 的总观察结果进行了子集化,然后对它们进行了计数。如果用户 ID 频率 >= 10,则提取前 10 个观察值。现在我面临的问题是每次循环迭代都会覆盖 newItemRatingData。
即使没有数据我无法重现您的问题,但您似乎在每次迭代中都替换了 newItemRatingData
中的结果。如果您使用 cbind()
,您可以将您的行附加到 newItemRatingData
而无需替换已经存在的行
newItemRatingData = data.frame()
for (i in 1:length(list_of_total_Users)) {
occurencePerID = subset(itemRatingData,
itemRatingData$V2%in%list_of_total_Users[[i]])
countOccurencePerID = count(occurencePerID, vars = "V2")
if(countOccurencePerID$freq >= 10){
newItemRatingData = cbind(newItemRatingData,occurencePerID[1:10,])
}
}
我已经解决了我的问题,解决方案是:
newItemRatingData = data.frame("V2" = numeric(0), "V1" = numeric(0), "V3" = integer(0))
for (i in 1:length(list_of_total_Users)) {
occurencePerID = subset(itemRatingData, itemRatingData$V2%in%list_of_total_Users[[i]])
countOccurencePerID = count(occurencePerID, vars = "V2")
if(countOccurencePerID$freq >= 10){
newItemRatingData = rbind(newItemRatingData,occurencePerID[1:10,])
}
}
至于@fino 的回答是绑定列数据框。我发现按行绑定数据框的解决方案