我有以下代码:
for(i in 1:length(hh_temp)){
hh_temp_save = hh_temp[[i]]
for(j in 4:nrow(hh_temp_save)){
hh_temp_save$max_min_sum_5days[j] = ifelse(sum(hh_temp_save$max_min_sum[(j-4):j])>2,1,0)
hh_temp[[i]] = hh_temp_save
}
}
字符串
其中hh_temp
是一个长度(hh_temp)= 12的列表,hh_temp
中的每个元素都是一个嵌套框。
我试图将for循环转换为嵌套的apply,但我发现,
lapply(hh_temp,\(x){
x = lapply(32:nrow(x),\(y){
x$max_min_sum_5days[y] = ifelse(sum(x$max_min_sum[(y-4):y])>2,1,0)
x
})
return(x)
})
型
我只能返回操作过的vector而不是整个数据集。有没有办法返回整个数据集?这是否意味着嵌套的lapply
不适合操作vector中的单个元素?
很抱歉,我无法提供数据集的详细信息,可以提供一些描述性统计数据:
> str(hh_temp)
List of 12
$ : tibble [3,684 × 36] (S3: tbl_df/tbl/data.frame)
..$ max_min_sum : num [1:3684] 0 0 0 0 0 0 0 0 0 0 ...
..$ max_min_sum_5days : num [1:3684] NA NA NA NA NA NA NA NA NA NA ...
$ : tibble [3,684 × 36] (S3: tbl_df/tbl/data.frame)
..$ max_min_sum : num [1:3684] 0 0 0 0 0 0 0 0 0 0 ...
..$ max_min_sum_5days : num [1:3684] NA NA NA NA NA NA NA NA NA NA ...
#repeated for 12 times
#max_min_sum is a binary variable
型
示例数据:
df = data.frame(a = as.factor(c(1,1,1,1,0,0,0,0,1,1,1,1,1,0,0,1,0,1)),
b = rep(NA,18))
sample_list = list(df,df,df,df,df,df)
型
我的预期结果是计算a中5个连续元素的累积和,然后如果连续和大于2,则B中相应的元素将被重新编码为1,否则为0。
| 一|B|
| --|--|
| 1 |NA|
| 1 |NA|
| 1 |NA|
| 1 |NA|
| 0 | 1 |
| 0 | 1 |
| 0 | 0 |
在a中的第5个元素中,由于有4个1s
和1个0
,因此,连续和大于2,B中的相应元素将被重新编码为1
。
1条答案
按热度按时间vxqlmq5t1#
我的预期结果是计算a中5个连续元素的累积和,然后如果连续和大于2,则B中相应的元素将被重新编码为1,否则为0。
如果
a
是一个因子变量,我们需要预先运行as.numeric(as.character(a))
来强制a
为数值。我们可以使用{zoo}
中的rollsum()
进行滚动求和计算。使用
lapply()
的解决方案适用于稍微修改的样本数据。验证码
字符串
或者像@G. Grothendieck建议的那样,以更紧凑的方式,
型
结果
型
修改数据
型
创建于2023-12-08带有reprex v2.0.2
编辑
如果你的数据很小,并且你不想依赖像
{zoo}
这样的外部软件包,你可以考虑自己编写滚动求和函数。非常基本的例子:型