首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在R中用n-(重复次数)替换数据帧中的重复条目?

如何在R中用n-(重复次数)替换数据帧中的重复条目?
EN

Stack Overflow用户
提问于 2021-08-31 12:20:36
回答 3查看 87关注 0票数 1

在我的数据中,我在列中有重复的条目。我要做的是,如果一个条目n在列中重复超过2次,那么我想用n-(number_of_times_it_has_repeated - 2)替换该条目。例如,如果我的数据如下所示:

代码语言:javascript
复制
  df <- data.frame(
  A = c(1,2,2,4,5,7,7,7,7,2,8,8),
  B = c(2,3,4,5,6,7,8,9,10,11,12,13)
)
> df
A  B
1  2
2  3
2  4
4  5
5  6
7  7
7  8
7  9
7 10
2 11
8 12
8 13

我们可以看到,在df$A 7中重复了4次。如果该条目被重复超过2次,那么我想替换该条目。所以在我的例子中,数字7的第一项和第二项将保持不变。数字7的第三个实例将改为:7- (3-2)。第四个数字7将被7- (4-2)所取代。

我们还可以看到,在df$A中,数字2被重复了3次。使用同样的方法,第三个实例2将被替换为2- (3-2)。

由于df$B中没有重复的值,因此该列将保持不变。

为了清楚起见,我的预期结果是:

代码语言:javascript
复制
dfNew <- data.frame(
  A = c(1,2,2,4,5,7,7,6,5,1,8,8),
  B = c(2,3,4,5,6,7,8,9,10,11,12,13)
)
> dfNew
A  B
1  2
2  3
2  4
4  5
5  6
7  7
7  8
6  9
5 10
1 11
8 12
8 13
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-08-31 12:38:49

这是你如何为一个专栏做这件事-

代码语言:javascript
复制
library(dplyr)

df %>%
  group_by(A) %>%
  transmute(A =  A - c(rep(0, 2), row_number())[row_number()]) %>%
  ungroup

#       A
#   <dbl>
# 1     1
# 2     2
# 3     2
# 4     4
# 5     5
# 6     7
# 7     7
# 8     6
# 9     5
#10     1
#11     8
#12     8

要对所有可以使用map_dfc的列执行此操作-

代码语言:javascript
复制
purrr::map_dfc(names(df), ~{
  df %>%
    group_by(.data[[.x]]) %>%
    transmute(!!.x :=  .data[[.x]] - c(rep(0, 2), row_number())[row_number()])%>%
    ungroup
})

#       A     B
#   <dbl> <dbl>
# 1     1     2
# 2     2     3
# 3     2     4
# 4     4     5
# 5     5     6
# 6     7     7
# 7     7     8
# 8     6     9
# 9     5    10
#10     1    11
#11     8    12
#12     8    13

这里的逻辑是,对于每个数字,我们从前2个值中减去0,然后减去-1-2等等。

票数 3
EN

Stack Overflow用户

发布于 2021-08-31 12:52:03

你可以跳过顺序,如果你不想,这是我的方法,如果你有一些数据,在变化之后仍然有一些重复,那么我可以工作在答案,把它放在一个函数或其他什么。

代码语言:javascript
复制
my_df <- data.frame(A = c(1,2,2,4,5,7,7,7,7,2,8,8),
                B = c(2,3,4,5,6,7,8,9,10,11,12,13),
                stringsAsFactors = FALSE)

my_df <- my_df[order(my_df$A, my_df$B),]

my_df$Id <- seq.int(from = 1, to = nrow(my_df), by = 1)

my_temp <- my_df %>% group_by(A) %>% filter(n() > 2) %>% mutate(Count = seq.int(from = 1, to = n(), by = 1)) %>% filter(Count > 2) %>% mutate(A = A - (Count - 2))

my_var <- which(my_df$Id %in% my_temp$Id)
if (length(my_var)) {
  my_df <- my_df[-my_var,]
  my_df <- rbind(my_df, my_temp[, c("A", "B", "Id")])
}
my_df <- my_df[order(my_df$A, my_df$B),]
票数 0
EN

Stack Overflow用户

发布于 2021-08-31 12:59:58

基于ave + pmax + seq_along的R基选项

代码语言:javascript
复制
list2DF(
  lapply(
    df,
    function(x) {
      x - ave(x, x, FUN = function(v) pmax(seq_along(v) - 2, 0))
    }
  )
)

给出

代码语言:javascript
复制
   A  B
1  1  2
2  2  3
3  2  4
4  4  5
5  5  6
6  7  7
7  7  8
8  6  9
9  5 10
10 1 11
11 8 12
12 8 13
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68998577

复制
相关文章

相似问题

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