我有以下代码:
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 循环转换为嵌套应用,但我发现
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)
})
我只能返回操纵后的向量,而不是整个数据集。有没有办法返回整个数据集?这是否意味着嵌套
lapply
不适合操作向量中的单个元素?
很抱歉我无法提供数据集的详细信息,可以提供一些描述性统计数据:
> 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。
a | b |
---|---|
1 | 不适用 |
1 | 不适用 |
1 | 不适用 |
1 | 不适用 |
0 | 1 |
0 | 1 |
0 | 0 |
a中的第5个元素, 由于有 4 个
1s
和 1 个0
,因此连续和大于 2,则 b 中对应的元素将被重新编码为 1
。
如果
a
是一个因子变量,我们需要事先运行as.numeric(as.character(a))
来将a
强制转换为数字。我们可以使用 rollsum()
中的 {zoo}
进行滚动总和计算。
这是使用
lapply()
应用于稍微修改的样本数据的解决方案:
# sample_list =
lapply(sample_list,
\(x) { x$b = ifelse(
zoo::rollsum(as.numeric(as.character(x$a)),
k = 5, fill = NA, align = "right") > 2L, 1L, 0L)
x})
这给出了
x})
#> [[1]]
#> a b
#> 1 1 NA
#> 2 1 NA
#> 3 1 NA
#> 4 1 NA
#> 5 0 1
#> 6 0 1
#> 7 0 0
#> 8 0 0
#> 9 1 0
#> 10 1 0
#> 11 1 1
#> 12 1 1
#> 13 1 1
#> 14 0 1
#> 15 0 1
#> 16 1 1
#> 17 0 0
#> 18 1 0
#>
#> [[2]]
#> a b
#> 1 1 NA
#> 2 2 NA
#> 3 3 NA
#> 4 4 NA
#> 5 5 1
#> 6 6 1
#> 7 7 1
#> 8 8 1
#> 9 1 1
#> 10 1 1
#> 11 1 1
#> 12 1 1
#> 13 1 1
#> 14 1 1
#> 15 1 1
#> 16 1 1
#> 17 1 1
#> 18 1 1
#>
#> [[3]]
#> a b
#> 1 1 NA
#> 2 1 NA
#> 3 1 NA
#> 4 1 NA
#> 5 0 1
#> 6 0 1
#> 7 0 0
#> 8 0 0
#> 9 1 0
#> 10 1 0
#> 11 1 1
#> 12 1 1
#> 13 1 1
#> 14 0 1
#> 15 0 1
#> 16 1 1
#> 17 0 0
#> 18 1 0
#>
#> [[4]]
#> a b
#> 1 1 NA
#> 2 1 NA
#> 3 1 NA
#> 4 1 NA
#> 5 0 1
#> 6 0 1
#> 7 0 0
#> 8 0 0
#> 9 1 0
#> 10 1 0
#> 11 1 1
#> 12 1 1
#> 13 1 1
#> 14 0 1
#> 15 0 1
#> 16 1 1
#> 17 0 0
#> 18 1 0
#>
#> [[5]]
#> a b
#> 1 1 NA
#> 2 1 NA
#> 3 1 NA
#> 4 1 NA
#> 5 0 1
#> 6 0 1
#> 7 0 0
#> 8 0 0
#> 9 1 0
#> 10 1 0
#> 11 1 1
#> 12 1 1
#> 13 1 1
#> 14 0 1
#> 15 0 1
#> 16 1 1
#> 17 0 0
#> 18 1 0
#>
#> [[6]]
#> a b
#> 1 1 NA
#> 2 1 NA
#> 3 1 NA
#> 4 1 NA
#> 5 0 1
#> 6 0 1
#> 7 0 0
#> 8 0 0
#> 9 1 0
#> 10 1 0
#> 11 1 1
#> 12 1 1
#> 13 1 1
#> 14 0 1
#> 15 0 1
#> 16 1 1
#> 17 0 0
#> 18 1 0
修改数据
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))
df2 = data.frame(a = as.factor(c(1:8, rep(1, 5), rep(1,5))),
b = rep(NA,18))
sample_list = list(df,df2,df,df,df,df)
创建于 2023-12-08,使用 reprex v2.0.2