【发布时间】:2017-03-09 22:04:09
【问题描述】:
我有一个大数据框 (df),其二项式值范围为 1 到 2。数据中也包含 NA。作为一个实际示例,我将创建一个包含用户数据子集的短向量:
df <- c(NA,NA,2,1,1,1,2,1,2,2,1,1,1,NA,2,2,1,2,1,1,1,2)
我基本上想要的结果是一个函数,它搜索数组的第一个和第二个2s,并将此间隔内的所有内容转换为 2。不过,如果第二个位置之间的差异并且前 2 个 > 3 然后值保持原样并且不执行任何更改。
除上述之外,该函数还必须为df 的每个值循环。例如,再次考虑以下情况:
df <- c(NA,NA,2,1,1,1,2,1,2,2,1,1,1,NA,2,2,1,2,1,1,1,2)
函数应该有这样的结果:
df_outcome <- c(NA,NA,2,1,1,1,2,2,2,2,1,1,1,NA,2,2,2,2,1,1,1,2)
请注意,在df_outcome 中,第一个和第二个 2 之间的值没有合并,因为它们的位置差异大于 3。另一方面,其他非 2 值也相应更改。
我试图做的事情(但它不能正常工作):
在zoo 包中的rollapply 的帮助下,我尝试创建一个函数来查找数组的第一个和第二个2 并执行上述修改。
func <- function (q) {
for (i in (which(q %in% 2)[1]):(which(q %in% 2)[2])) {
q[i]<-2
}
return(q)
}
然后我使用rollapply嵌套它,这样我就可以为每个循环指定一个特定的宽度以及其他参数,例如结果索引的位置(左)。
df_outcome<-rollapply(df, width = 3, FUN = func, fill = NA, partial = TRUE, align = "left")
问题在于,如果将用户生成的函数应用于向量,则该函数可以正常工作。但是,当作为参数嵌套在 rollapply 函数中时,它会返回错误:
错误 (which(q %in% 2)[1]):(which(q %in% 2)[2]) : NA/NaN 参数 调用自:FUN(data[replace(posns, !ix, 0)], ...)
我想我在使用rollapply 或数据格式方面存在一些错误,但我不明白可能是什么问题。我考虑过使用rollapply,因为我的数据很长,而且是为不同的用户生成的。因此,我需要一个函数,该函数还可以根据其他变量分割数据,例如User_ID(很像ddply 中的.variablesargument 或data.table 中的by。
期待您的支持。
【问题讨论】:
标签: r for-loop dataframe error-handling rollapply