【问题标题】:In R, comparing 2 fields across 2 rows in a dataframe在 R 中,比较数据框中 2 行的 2 个字段
【发布时间】:2017-08-03 19:42:12
【问题描述】:

我正在尝试比较 R 中数据帧上连续行的 2 个不同字段,并指出不同的字段。以下是输入数据:-

 Start    End
1 Atl      Bos    
2 Bos      Har  
3 Har      NYC  
4 Stf      SFO
5 SFO      Chi

我正在尝试建立一个运动链,并且 End 与下一行的 Start 不匹配,我想指示该行。因此,对于上述内容,我将第 4 行指示如下:-

 Start    End    Ind
1 Atl      Bos   Y 
2 Bos      Har   Y
3 Har      NYC   Y
4 Stf      SFO   N
5 SFO      Chi   Y

我对 R 很陌生,我尝试查找此问题,但似乎找不到解决方案。任何帮助表示赞赏。

【问题讨论】:

    标签: r dataframe data-analysis data-science rscript


    【解决方案1】:

    另一种选择是:

    > Ind <- as.character(dat$Start[-1]) == as.character(dat$End [-length(dat$End)])
    > dat$Ind <- c(NA, ifelse(Ind==TRUE, "Y", "N")) 
    > dat
      Start End  Ind
    1   Atl Bos <NA>
    2   Bos Har    Y
    3   Har NYC    Y
    4   Stf SFO    N
    5   SFO Chi    Y
    

    请注意,您的第一项应为&lt;NA&gt;

    【讨论】:

    • 考虑到两个列中的值属于同一个池(而不是即时执行 as.character对于每个这样的操作)。
    • 感谢@Jilber,这正是我想要的。虽然如果你不介意快速解释。我不太清楚 dat$End [-length(dat$End)]) 部分的逻辑。我不太清楚它在做什么。
    • 感谢@Frank,我将使用建议来提高代码效率。
    【解决方案2】:

    您可以通过dplyr 使用mutatelead 来做到这一点。请注意,最后一项应为NA,因为没有第 6 行可与 SFO-CHI 进行比较。

    library(dplyr)
    df1  <- read.table(text=" Start    End
    Atl      Bos
    Bos      Har
    Har      NYC
    Stf      SFO
    SFO      Chi", header=TRUE, stringsAsFactors=FALSE)
    
    df1 %>%
    mutate(Ind=ifelse(End==lead(Start),"Y","N"))
    
      Start End  Ind
    1   Atl Bos    Y
    2   Bos Har    Y
    3   Har NYC    N
    4   Stf SFO    Y
    5   SFO Chi <NA>
    

    【讨论】:

    • 谢谢@P Lapointe。我看到你在那里做什么。唯一的事情是我需要在 Start 与前一行的 End 不匹配的行上显示“N”指示符。上面@Jilber 给出的解决方案一针见血。但是当使用 dplyr 时,我可以轻松地修改您的代码以满足我的需要。
    • 是的,只需将lead 更改为lag,它就会按照您想要的方式工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 2019-09-08
    • 1970-01-01
    • 2022-06-30
    • 1970-01-01
    相关资源
    最近更新 更多