我的数据框如下
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
来提取行号然后遍历数据框以更改值的有效解决方案,因为我的数据框尺寸很大。
答案 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]
。
i
在x
中查找on=
的每一行。 i
行中有多个匹配项时,将采用最后一个匹配项。 j
中,我们正在匹配行的b
中更新x
。