【问题标题】:How to mutate a column given a dataframe that has the conditions?给定具有条件的数据框,如何改变列?
【发布时间】:2018-05-29 04:37:44
【问题描述】:

我有一个两列数据框。第一列是时间戳,第二列是某个值。例如:

library(tidyverse)
set.seed(123)
data_df <- tibble(t = 1:15,
                  value = sample(letters, 15))

我有另一个数据框,它指定需要更新的时间戳范围及其对应的值。例如:

criteria_df <- tibble(start = c(1, 3, 7),
                      end = c(2, 5, 10),
                      value = c('a', 'b', 'c')
                      )

这意味着我需要改变 data_df 中的 value 列,使其从 t=1 到 t=2 的值是 'a',从 t=3 到 t=5 是 'b',从 t=7 到t=10 是“c”。

在 R 中推荐的方法是什么?

我能想到的唯一方法是循环criteria_df中的每一行并在过滤t列后改变data_df中的值列,如下所示:

library(iterators)
library(foreach)

foreach(row = row_iter, .combine = c) %do% {
  seg_start = row$start
  seg_end = row$end
  new_value = row$value

  data_df %<>%
    mutate(value = if_else(between(t, seg_start, seg_end),
                                    new_value,
                                    value))
  NULL
}

【问题讨论】:

  • 您想替换value 列中的值,对吗?那么值 11 到 15 呢?他们会保持原样吗?
  • 您愿意接受data.table 解决方案吗?我认为这应该是一个更新加入 - data_df[criteria_df, on=c("t&gt;=start","t&lt;=end"), value := i.value]
  • @RonakShah 是的,11 到 15 的值将保持不变。
  • 在这种情况下,@thelatemail 提供的解决方案将起作用。
  • @thelatemail 感谢data.table 的提示。我想一个 tidyverse 解决方案是不可能的,因为dplyr 不支持非等连接?

标签: r dplyr


【解决方案1】:

我们可以做一个两步基本 R 解决方案,我们首先找到位于 criteria_df startend 范围内的值,然后将 data_df value 替换为等效的 @ 987654326@'s value 如果匹配或保持原样。

inds <- sapply(data_df$t, function(x) criteria_df$value[x >= criteria_df$start 
                                                      & x <= criteria_df$end])

data_df$value <- unlist(ifelse(lengths(inds) > 0, inds, data_df$value))
data_df

#      t value
#   <int> <chr>
# 1     1 a    
# 2     2 a    
# 3     3 b    
# 4     4 b    
# 5     5 b    
# 6     6 a    
# 7     7 c    
# 8     8 c    
# 9     9 c    
#10    10 c    
#11    11 p    
#12    12 g    
#13    13 r    
#14    14 s    
#15    15 b    

【讨论】:

    猜你喜欢
    • 2012-10-30
    • 1970-01-01
    • 2022-12-12
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 2013-12-03
    • 2020-02-09
    相关资源
    最近更新 更多