【问题标题】:String comparison in 2 adjacent rows of a data frame in RR中数据帧的2个相邻行中的字符串比较
【发布时间】:2019-09-08 13:14:40
【问题描述】:

我有一个包含 627 个观察值和 16 个变量的数据框。我正在考虑一个名为“ZoneDivison”的列,其中包含以下因素:东北部、东部和东南部。 所以,我想比较相邻行的值并创建一个新列,如果两个相邻行具有相同的区域,则为 1,如果相邻行不同,则为 0。

我参考了以下链接来寻找出路: [这里]Matching two Columns in R [这里]compare row values over multiple rows (R)

library(dplyr)
a <- c(rep("Eastern",3),rep ("North Eastern", 6),rep("South Eastern", 3))
a=data.frame(a)
colnames(a)="ZoneDivision"

#comparing the zones
library(plyr)
ddply(n, .(ZoneDivision),summarize,ZoneMatching=Position(isTRUE,ZoneDivision))


Expected Result

   ZoneDivision ZoneMatching
 1      Eastern       NA
 2      Eastern       1
 3       Eastern      1               
 4 North Eastern      0
 5 North Eastern      1
 6 North Eastern      1
 7 North Eastern      1
 8 North Eastern      1
 9 North Eastern      1
 10 South Eastern     0
 11 South Eastern     1
 12 South Eastern     1

Actual Result
    ZoneDivision ZoneMatching
1       Eastern           NA
2 North Eastern           NA
3 South Eastern           NA

我应该如何进行?请帮忙!!

【问题讨论】:

    标签: r string if-statement compare rows


    【解决方案1】:

    使用base R,我们可以做到

    as.numeric(c(NA, a$ZoneDivision[-1] == a$ZoneDivision[-nrow(a)]))
    #[1] NA  1  1  0  1  1  1  1  1  0  1  1
    

    【讨论】:

    • 感谢 Ronak,帮了大忙。
    【解决方案2】:

    data.table方式:

    a <- c(rep("Eastern",3),rep ("North Eastern", 6),rep("South Eastern", 3))
    dt <- as.data.table(a)
    
    dt[,'ZoneMatching' := as.numeric(.SD[,a] == shift(.SD[,a],1))]
    

    您添加一个新的 ZoneMatching 列作为 a 列和滞后值之间的逻辑比较的数值,由 shift() 生成 功能。

    【讨论】:

      【解决方案3】:

      您可以使用lag 来获取:

      library(dplyr)
      a %>%
        mutate(ZoneMatching = as.numeric((ZoneDivision == lag(ZoneDivision, 1))))
          ZoneDivision ZoneMatching
      1        Eastern           NA
      2        Eastern            1
      3        Eastern            1
      4  North Eastern            0
      5  North Eastern            1
      6  North Eastern            1
      7  North Eastern            1
      8  North Eastern            1
      9  North Eastern            1
      10 South Eastern            0
      11 South Eastern            1
      12 South Eastern            1
      

      【讨论】:

        【解决方案4】:

        我们可以使用base R

        with(a, c(NA, +(head(ZoneDivision, -1) == tail(ZoneDivision, -1))))
        #[1] NA  1  1  0  1  1  1  1  1  0  1  1
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-10-09
          • 1970-01-01
          • 1970-01-01
          • 2018-09-27
          • 1970-01-01
          • 2023-04-01
          • 2017-08-03
          • 1970-01-01
          相关资源
          最近更新 更多