首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据其他列和日期条件条件创建新列

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

Stack Overflow用户
提问于 2022-08-14 08:34:34
回答 2查看 75关注 0票数 3

我希望根据第2-4列中的数据创建一个新列,如果日期列在上一行之前或之后,则对其进行条件调整。我的数据如下:

代码语言:javascript
复制
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  

预期的产出如下:

代码语言:javascript
复制
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

这就是我尝试过的:

代码语言:javascript
复制
for (i in 2:4){
new_data <- data %>% mutate(NewColumn = ifelse(
    as.Date(date) > lag(as.Date(date)), data[,i], data[,i+1]))}

但这只会产生:

代码语言:javascript
复制
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

我怎么才能解决这个问题?有什么建议吗?

EN

回答 2

Stack Overflow用户

发布于 2022-08-14 10:43:22

使用dplyr.创建自定义组时,我们可以使用它将新值突变到列中。

代码语言:javascript
复制
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)
代码语言:javascript
复制
  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
票数 2
EN

Stack Overflow用户

发布于 2022-08-14 09:53:48

  • 您可以试试这个

代码语言:javascript
复制
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]
    }
}

  • Output

代码语言:javascript
复制
        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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73350195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档