gpt4 book ai didi

r - 查找向量的相似元素并修改其间的所有内容

转载 作者:行者123 更新时间:2023-12-04 21:56:00 24 4
gpt4 key购买 nike

我有一个大数据框 (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)

作为结果,我基本上想要的是一个搜索第一个和第二个 2 的函数。 s 并将此间隔内的所有内容转换为 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 值也相应更改。

我试图做的(但它不能正常工作):

rollapply 的帮助下在 zoo包,我试图创建一个函数来查找数组的第一个和第二个 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 中时但是,它返回一个错误:

Error in (which(q %in% 2)[1]):(which(q %in% 2)[2]) : NA/NaN argument Called from: FUN(data[replace(posns, !ix, 0)], ...)



我想我在使用 rollapply 时有一些错误。或者可能是数据的格式,但我不明白可能是什么问题。我想过用 rollapply因为我的数据很长,而且是为不同的用户生成的。因此,我需要一个函数,该函数还可以根据其他变量(例如 User_ID)拆分数据。 (很像 .variables 中的 ddply 参数或 by 中的 data.table

期待您的支持。

最佳答案

rle的解决方案:

rldf <- rle(df)
rllag <- c(tail(rldf$values,-1), NA)
rllead <- c(NA, head(rldf$values,-1))

rldf$values[which(rldf$values == 1 & rllag == 2 & rllead == 2 & rldf$lengths < 3)] <- 2

df_out <- inverse.rle(rldf)

这使:
> df_out
[1] NA NA 2 1 1 1 2 2 2 2 1 1 1 NA 2 2 2 2 1 1 1 2

> identical(df_outcome,df_out)
[1] TRUE

关于r - 查找向量的相似元素并修改其间的所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40280910/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com