根据其他列和日期条件创建新列

3

我想根据第二到第四列的数据创建一个新列,条件是日期列是前一行之前还是之后。我的数据如下:

date        city1  city2   city3    
2022-01-25  Paris  London  Berlin  
2022-01-28  Paris  London  Berlin  
2022-02-04  Paris  London  Berlin  
2022-01-26  Paris  London  Berlin  
2022-02-08  Paris  London  Berlin  
2022-02-02  Paris  London  Berlin  
2022-02-04  Paris  London  Berlin  
2022-02-06  Paris  London  Berlin  

预期的输出结果如下所示:
date        city1  city2   city3   NewColumn 
2022-01-25  Paris  London  Berlin  Paris
2022-01-28  Paris  London  Berlin  Paris
2022-02-04  Paris  London  Berlin  Paris
2022-01-26  Paris  London  Berlin  London
2022-02-08  Paris  London  Berlin  London
2022-02-02  Paris  London  Berlin  Berlin
2022-02-04  Paris  London  Berlin  Berlin
2022-02-06  Paris  London  Berlin  Berlin

这是我尝试过的内容:
for (i in 2:4){
new_data <- data %>% mutate(NewColumn = ifelse(
    as.Date(date) > lag(as.Date(date)), data[,i], data[,i+1]))}

但是这只会生成:
date        city1  city2   city3   NewColumn 
2022-01-25  Paris  London  Berlin  <NA>
2022-01-28  Paris  London  Berlin  Berlin
2022-02-04  Paris  London  Berlin  Berlin
2022-01-26  Paris  London  Berlin  London
2022-02-08  Paris  London  Berlin  London
2022-02-02  Paris  London  Berlin  Berlin
2022-02-04  Paris  London  Berlin  Berlin
2022-02-06  Paris  London  Berlin  Berlin

我该如何解决这个问题?有什么建议吗?


tidyr::fill(NewColumn, .direction = "up") 将是一个快速的解决方法。 - Julian
能否进一步说明一下,根据我的示例代码。我无法让它正常工作。 - Kalle Blomkvist
1
嗨@KalleBlomkvist,我撤销了您删除问题文本的编辑 - 即使您的问题已得到解答,将其保留在此处将有助于未来遇到类似问题的其他人。如果您真的想要删除它,您可以将其删除(而不是编辑以删除所有内容),但我鼓励您将其保留下来。 - zephryl
2个回答

2
使用dplyr。创建自定义分组,我们可以使用它将新值变异到列中。
library(dplyr)

df |>
      group_by(grp = cumsum(c(1, diff(lubridate::ymd(date))) < 0) + 1) |>
      rowwise() |> 
      mutate(NewColumn = c_across(city1:city3)[grp]) |> 
      ungroup() |> select(-grp)

  date       city1 city2  city3  NewColumn
  <chr>      <chr> <chr>  <chr>  <chr>    
1 2022-01-25 Paris London Berlin Paris    
2 2022-01-28 Paris London Berlin Paris    
3 2022-02-04 Paris London Berlin Paris    
4 2022-01-26 Paris London Berlin London   
5 2022-02-08 Paris London Berlin London   
6 2022-02-02 Paris London Berlin Berlin   
7 2022-02-04 Paris London Berlin Berlin   
8 2022-02-06 Paris London Berlin Berlin

0
你可以试一下。
j <- 2
lag_d <- c(0 , df$date)
for(i in 1:(length(lag_d)-1)){
    if(lag_d[i+1] > lag_d[i]) df$NewColumn[i] <- df[i,j]
    else {
        j <- j + 1
        df$NewColumn[i] <- df[i,j]
    }
}
  • 输出
        date city1  city2  city3 NewColumn
1 2022-01-25 Paris London Berlin     Paris
2 2022-01-28 Paris London Berlin     Paris
3 2022-02-04 Paris London Berlin     Paris
4 2022-01-26 Paris London Berlin    London
5 2022-02-08 Paris London Berlin    London
6 2022-02-02 Paris London Berlin    Berlin
7 2022-02-04 Paris London Berlin    Berlin
8 2022-02-06 Paris London Berlin    Berlin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接