【问题标题】:Replace last row of column with last row of another column in R用R中另一列的最后一行替换列的最后一行
【发布时间】:2020-08-29 09:59:10
【问题描述】:

我需要用另一列的最后一行替换每个组的最后一行。以前,我可以通过将除最后一行之外的所有数据设为零,然后使用ifelse 到mutate 的列来实现这一点,该列仅取大于 0 的值。但最后一行始终是最低值,所以我可以使用case_when 仅选择最小值。现在数据是随机的,大小与位置无关。

在这种情况下,我希望 PCAR1 中的最后一个值替换 PCAR 中的最后一个值。

我一直在尝试使用 slice 或 tail,但我只是收到错误返回。到目前为止,我有一些看起来像:

df <- df%>%
  group_by(time_bin)%>%
  mutate(PCAR1 = ifelse(slice(1:(n()-1)), PCAR1, 0))%>%
  mutate(PCAR = ifelse(PCAR1 >0, PCAR1, PCAR))


#Data# 

df <- structure(list(time_bin = c(100, 100, 100, 100, 100, 100, 100, 
100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 
100, 100, 100, 100, 100, 100, 200, 200, 200), PCAR1 = c(325.947943826017, 
339.835783930254, 310.492430685748, 332.43346350175, 199.54398828513, 
142.821605613045, 191.572198416637, 170.67567450243, 131.535087546719, 
329.624262985389, 229.99470258103, 217.344970472844, 157.85520203161, 
153.107703614107, 131.659911154268, 82.4153938744129, 162.845234183621, 
106.871069919164, 61.5051800997765, 126.922394965646, 87.0148189713542, 
95.0831508155524, 71.7975354573988, 32.3815944849868, 24.2498801736037, 
21.6391689024657, 14.8451420537953, 14.7021072370529, 19.0482898453303
), PCAR = c(377.981689418665, 325.947943826017, 339.835783930254, 
310.492430685748, 332.43346350175, 199.54398828513, 142.821605613045, 
191.572198416637, 170.67567450243, 131.535087546719, 329.624262985389, 
229.99470258103, 217.344970472844, 157.85520203161, 153.107703614107, 
131.659911154268, 82.4153938744129, 162.845234183621, 106.871069919164, 
61.5051800997765, 126.922394965646, 87.0148189713542, 95.0831508155524, 
71.7975354573988, 32.3815944849868, 24.2498801736037, 21.6391689024657, 
14.8451420537953, 14.7021072370529)), row.names = c(NA, -29L), class = c("tbl_df", 
"tbl", "data.frame"))


Thanks!

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以为每个time_bin 值使用replace。

    library(dplyr)
    df %>% group_by(time_bin) %>% mutate(PCAR1 = replace(PCAR1, n(), last(PCAR)))
    

    这将replace 最后一个PCAR1 值与PCAR 的最后一个值。

    【讨论】:

      【解决方案2】:

      另一种选择是构造一个新向量:

      library(dplyr)
      
      df %>%
        group_by(time_bin) %>%
        mutate(PCAR1 = c(PCAR1[-n()], PCAR[n()]))
      

      【讨论】:

        【解决方案3】:

        我们可以使用data.table

        library(data.table)
        i1 <- setDT(df)[, .I[.N], time_bin]$V1
        df[i1, PCAR1 := PCAR]
        

        或者使用duplicated而不必使用group_by

        library(dplyr)
        df %>%
           mutate(PCAR1 =  case_when(!duplicated(time_bin, fromLast = TRUE) 
               ~ PCAR, TRUE ~ PCAR1))
        

        【讨论】:

          猜你喜欢
          • 2023-03-18
          • 2013-12-03
          • 2020-11-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-20
          • 2020-06-30
          • 2017-10-28
          相关资源
          最近更新 更多