在我的数据中,我在列中有重复的条目。我要做的是,如果一个条目n在列中重复超过2次,那么我想用n-(number_of_times_it_has_repeated - 2)替换该条目。例如,如果我的数据如下所示:
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中没有重复的值,因此该列将保持不变。
为了清楚起见,我的预期结果是:
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发布于 2021-08-31 12:38:49
这是你如何为一个专栏做这件事-
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的列执行此操作-
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等等。
发布于 2021-08-31 12:52:03
你可以跳过顺序,如果你不想,这是我的方法,如果你有一些数据,在变化之后仍然有一些重复,那么我可以工作在答案,把它放在一个函数或其他什么。
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),]发布于 2021-08-31 12:59:58
基于ave + pmax + seq_along的R基选项
list2DF(
lapply(
df,
function(x) {
x - ave(x, x, FUN = function(v) pmax(seq_along(v) - 2, 0))
}
)
)给出
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 13https://stackoverflow.com/questions/68998577
复制相似问题