查找列中最后一次出现的唯一值并更改R中的值

时间:2019-03-22 02:27:17

标签: r dataframe

我的数据框如下

for(int i = 1; i <= height; i++) {
  if( i == 1 || i == height) {
    for (int j = 1; j <= width; j++) {
      std::cout << ch << " ";
    }
    std::cout << std::endl;
   } else {
    for (int j = 1; j <= width; j++) {
      if( j == 1 || j == width) {
        std::cout << ch << " ";
      } else {
        std::cout << "  ";
      }
    }
    std::cout << std::endl;
  }
}

在每个a b 5 0 5 0 5 0 6 0 6 0 唯一值的最后一个实例中,我需要编辑列b并将其更改为一。示例预期输出为

a

我正在寻找一种比使用a b 5 0 5 0 5 1 6 0 6 1 来提取行号然后遍历数据框以更改值的有效解决方案,因为我的数据框尺寸很大。

3 个答案:

答案 0 :(得分:2)

使用duplicated并将fromLast设置为TRUE,以便从a的结尾开始查找。

with(df1, replace(b, !duplicated(a, fromLast = TRUE), 1))
#[1] 0 0 1 0 1

答案 1 :(得分:2)

多种方法

library(dplyr)

df %>%
  group_by(a) %>%
  mutate(b = if_else(row_number() == n(), 1L ,b))

#     a     b
#  <int> <dbl>
#1     5     0
#2     5     0
#3     5     1
#4     6     0
#5     6     1

使用ave

with(df, ave(b, a, FUN = function(x) ifelse(seq_along(x) == length(x), 1, x)))

编辑

如果您将列作为字符,我们需要先将其转换为数字并使用if_else

df %>%
  mutate_all(as.numeric) %>%
  group_by(a) %>%
  mutate(b = if_else(row_number() == n(), 1 ,b))

或者仅使用ifelse,因为它不依赖严格的类型检查

df %>%
  group_by(a) %>%
  mutate(b = ifelse(row_number() == n(), 1 ,b))

答案 2 :(得分:1)

您可以在最后一行进行联接:

library(data.table)
setDT(DT)

DT[.(unique(a)), on=.(a), mult="last", b := 1]

   a b
1: 5 0
2: 5 0
3: 5 1
4: 6 0
5: 6 1

语法为x[i, on=, j]

  • 它使用连接条件ix中查找on=的每一行。
  • i行中有多个匹配项时,将采用最后一个匹配项。
  • j中,我们正在匹配行的b中更新x