嵌套列表不适合操作向量中的单个元素吗?

问题描述 投票:0回答:1

我有以下代码:

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

r apply lapply sapply
1个回答
0
投票

如果

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

© www.soinside.com 2019 - 2024. All rights reserved.