如何使用函数来分析所有小标题中的所有行,将我的数据放在小标题列表中?

马克

我有一个包含 106 个小标题的列表,每个小标题包含两列(日期、温度),其中包含数千个值。

我尝试创建一个函数,该函数允许我通过 tibble 获取四次温度低于 8.0 的行的索引。

我遇到的问题是我的代码只执行每个小节的第一行。

在这里你可以看到代码:

pos_r = 0;
temp =0; 
posx = vector();
for (i in seq_along(data_sensor)){
  if (temp < 4){
    pos_r = pos_r + 1;
  if (data_sensor[[i]]$Temperature < 8.0){
       temp=temp+1;
} else if (temp == 4){
   posx[i] = pos_r;
   i = i+1;
}
}
}



> [1] NA NA NA NA NA NA  5  6 NA  7  8 NA NA  9 NA NA NA 10 11 NA 12 13 14 NA 15 16 17 18 19 NA
 [31] 20 21 22 NA 23 24 25 26 27 NA 28 NA 29 30 NA 31 32 33 34 NA 35 36 37 38 NA 39 40 41 42 43
 [61] 44 NA 45 NA 46 47 48 49 50 51 52 53 54 55 56 57 58 NA NA NA 59 60 61 NA 62 63 NA 64 65 66
 [91] NA 67 NA NA 68 69 70 71 72 73 74 75 76 77 78 79

我怎样才能处理列表中每一个 tibble 的所有行?

艾皮10

这是一种选择:在下面的代码中,我们使用逻辑测试来查找四天温度低于 8 的行的索引。然后我们使用map在列表中的每个数据框上实现这个方法。

library(tidyverse)

# Generate a list of 5 data frames to work with
set.seed(33)
dl = replicate(5, tibble(date=seq(as.Date("2021-01-01"), as.Date("2021-02-01"), by="1 day"),
                         temperature = 10 + cumsum(rnorm(length(date), 0, 3))),
               simplify=FALSE)

# Index of row of fourth day with temperataure lower than 8
# Run this on the first data frame in the list
min(which(cumsum(dl[[1]][["temperature"]] < 8) == 4))
#> [1] 8

# Run the method on each data frame in the list
# Note that infinity is returned if no data row meets the condition
idx8 = dl %>% 
  map_dbl(~ min(which(cumsum(.x[["temperature"]] < 8) == 4)))

idx8
#> [1]   8  29 Inf   7   6

以下是列表中第一个数据框的各个步骤:

# Logical vector returning TRUE when temperature is less than 8
dl[[1]][["temperature"]] < 8
#>  [1] FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE
#> [13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
#> [25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

# Cumulative number of days where temperature was less than 8
cumsum(dl[[1]][["temperature"]] < 8) 
#>  [1] 0 0 0 0 1 2 3 4 4 5 6 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7

# Index of rows for which the cumulative number of days where 
#  temperature was less than 8 is equal to 4
which(cumsum(dl[[1]][["temperature"]] < 8) == 4)
#> [1] 8 9

# We want the index of the first row that meets the condition
min(which(cumsum(dl[[1]][["temperature"]] < 8) == 4))
#> [1] 8

从每个数据框中获取指定的行,如果没有满足条件的行,则获取缺失值。将结果作为数据帧返回:

list(dl, idx8) %>% 
  pmap_dfr(~ { 
    if(is.infinite(.y)) {
      tibble(date=NA, temperature=NA)
    } else {
      .x %>% 
        slice(.y) %>% 
        mutate(row.index=.y) %>% 
        relocate(row.index)
    }
  },
  .id="data.frame")
#> # A tibble: 5 × 4
#>   data.frame row.index date       temperature
#>   <chr>          <dbl> <date>           <dbl>
#> 1 1                  8 2021-01-08       7.12 
#> 2 2                 29 2021-01-29      -0.731
#> 3 3                 NA NA              NA    
#> 4 4                  7 2021-01-07       6.29 
#> 5 5                  6 2021-01-06       4.58

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在R中的小标题内的列表中的所有行中选择特定元素

如何用列表中的小标题和小标题拼合列表,以使所有小标题都处于同一级别?

将嵌套的小标题的所有列取消嵌套到小标题列表

显示/打印小标题的所有行(tbl_df)

无法从小标题列表中获取所有日期的列表

对R中的列表中的所有小标题应用相同的操作

从R中的数据帧/小标题中采样分组的行

合并小标题中的行

如何从get_friends函数返回的小标题列表中删除空小标题?

根据小标题中的特定值过滤小标题列表

有没有一种方法可以使用ggplot2从一个小标题中将所有值放在一个小块中生成散点图,而无需ivot_wider?

R:如何在小标题中访问小标题?

如何使用参数列表(小标题)进行函数调用

使用每个小标题中的名称从小标题列表中选择变量

如何从带有列表列的小标题中提取单个元素,列表列是尺寸不等的列表列表?

如何快速绘制小标题的一列与所有其他列的关系图?

如果所有组中都出现变量观察,则过滤R中的小标题

当列表有零行和n()列时,从列表中删除小标题

我想在小标题中重复观察(行)

如何对小标题中的分组值应用函数

创建一个函数来迭代R中大列表中的小标题元素

如何将嵌套列表名称转换为带有行名称的小标题

如何在小标题中的行之间进行操作?

排除小标题中的常见行

如何删除小标题中的偏移行?

数字总和在数据帧中有效,但在小标题中无效

如何将SharePoint列表加载到R中的小标题中?

如何在小标题中为列表列使用`mutate_at`?

使用{tibble}中的框架后,将小标题中的列表列转换为多列