基于R中现有列的条件创建新列

izkcnapc  于 2023-02-06  发布在  其他
关注(0)|答案(1)|浏览(89)
    • 较短版本**对于每个spread_event,我需要根据现有leaf_wetness_duration列创建一个新列,即观察到5小时或超过5小时UNINTURRUPTED/CONTINUOUS干奶期为TRUE。我对每行不感兴趣,我对spread_event感兴趣。
    • 更长的版本**我把植物放在田里一个星期或spread_event。天气数据以15分钟的间隔记录,因此每行代表15分钟的持续时间,leaf_wetness_duration列列出了雨水或相对湿度引起的叶片湿润的持续时间,我想检验孢子是否能在UINTURRPED干燥期存活5小时或更长时间的假设。因此,如果有1小时干期和1小时湿期,然后是1小时湿/干期,以及5小时或更长的干期,我希望这是假的,因为我只对连续干期感兴趣。我可以计算干期,但不知道如何计算UNINTERRUPTED/CONTINUOUS干期。
df %>%
group_by(spread_event) %>%
mutate (dry_period= ???) # spread event with continuous dry period of five hours or more
Spread_event        date            leaf_wetness_duration
1             8/19/15 7:15 PM                  15
1             8/19/15 7:30 PM                  2
1             8/19/15 7:45 PM                  0
1             8/19/15 8:00 PM                  0
1             8/19/15 8:15 PM                  0
1             8/19/15 8:30 PM                  0
1             8/19/15 8:45 PM                  0
1             8/19/15 9:00 PM                  0
1             8/19/15 9:15 PM                  0
1             8/19/15 9:30 PM                  0
1             8/19/15 9:45 PM                  0
1             8/19/15 10:00 PM                 0
1             8/19/15 10:15 PM                 0
1             8/19/15 10:30 PM                 0
1             8/19/15 10:45 PM                 3

在上面的示例中,我可以说UNINTURREPTED叶片湿润持续时间为180分钟或3小时(12行零湿度-每行代表15分钟的持续时间,12 * 15 = 180分钟)。我希望在R中而不是手动执行此操作,因为数据集非常庞大。是否有一种方法可以直接计算20行的leaf_wetness_duration == 0leaf_wetness_duration == 0之间无湿润期)?
谢谢

bxgwgixi

bxgwgixi1#

我们可以使用rle函数来查找0的最长连续串。

library(dplyr)
df %>%
  group_by(Spread_event) %>%
  mutate(
    longest_run_of_0 = with(rle(leaf_wetness_duration), max(lengths[values == 0]) >= 20)
  ) %>%
  ungroup()

# # A tibble: 15 × 4
#    Spread_event date             leaf_wetness_duration longest_run_of_0
#           <int> <chr>                            <int> <lgl>           
#  1            1 8/19/15 7:15 PM                     15 FALSE           
#  2            1 8/19/15 7:30 PM                      2 FALSE           
#  3            1 8/19/15 7:45 PM                      0 FALSE           
#  4            1 8/19/15 8:00 PM                      0 FALSE           
#  5            1 8/19/15 8:15 PM                      0 FALSE           
#  6            1 8/19/15 8:30 PM                      0 FALSE           
#  7            1 8/19/15 8:45 PM                      0 FALSE           
#  8            1 8/19/15 9:00 PM                      0 FALSE           
#  9            1 8/19/15 9:15 PM                      0 FALSE           
# 10            1 8/19/15 9:30 PM                      0 FALSE           
# 11            1 8/19/15 9:45 PM                      0 FALSE           
# 12            1 8/19/15 10:00 PM                     0 FALSE           
# 13            1 8/19/15 10:15 PM                     0 FALSE           
# 14            1 8/19/15 10:30 PM                     0 FALSE           
# 15            1 8/19/15 10:45 PM                     3 FALSE

如果您需要此类运行的计数,则可以使用count = with(rle(leaf_wetness_duration), sum(lengths[values == 0] >= 20))
使用此示例数据

df = read.table(header = T, text = 'Spread_event        date            leaf_wetness_duration
1             "8/19/15 7:15 PM"                  15
1             "8/19/15 7:30 PM"                  2
1             "8/19/15 7:45 PM"                  0
1             "8/19/15 8:00 PM"                  0
1             "8/19/15 8:15 PM"                  0
1             "8/19/15 8:30 PM"                  0
1             "8/19/15 8:45 PM"                  0
1             "8/19/15 9:00 PM"                  0
1             "8/19/15 9:15 PM"                  0
1             "8/19/15 9:30 PM"                  0
1             "8/19/15 9:45 PM"                  0
1             "8/19/15 10:00 PM"                 0
1             "8/19/15 10:15 PM"                 0
1             "8/19/15 10:30 PM"                 0
1             "8/19/15 10:45 PM"                 3')

相关问题