替换 R 中列中的重复元素
Replace duplicate elements in a column in R
我有一个 data.frame 看起来像这样 -
columnA=c(1,2,3,1.1,2.2,3.3,1,2)
columnB=c("a","b","c","d","e","f","g","h")
data=data.frame(columnA, columnB)
columnA columnB
1 1.0 a
2 2.0 b
3 3.0 c
4 1.1 d
5 2.2 e
6 3.3 f
7 1.0 g
8 2.0 h
我想在 A 列中找到重复项并将它们替换为相同的元素
B 列中的行。我希望 C 列像这样
columnA columnB columnC
1 1.0 a 1.0
2 2.0 b 2.0
3 3.0 c 3.0
4 1.1 d 1.1
5 2.2 e 2.2
6 3.3 f 3.3
7 1.0 g g
8 2.0 h h
其中 A 列第 7 行和第 8 行重复 1.0 和 3.0
已替换为 B 列第 7 行和第 8 行中的相应元素 [g 和 h]
如有任何帮助,我们将不胜感激。纠结了好久。
您可以在 columnC
中复制 columnA
值,然后将 duplicated
值替换为 columnB
。
data$columnC <- data$columnA
inds <- duplicated(data$columnA)
data$columnC[inds] <- data$columnB[inds]
data
# columnA columnB columnC
#1 1.0 a 1
#2 2.0 b 2
#3 3.0 c 3
#4 1.1 d 1.1
#5 2.2 e 2.2
#6 3.3 f 3.3
#7 1.0 g g
#8 2.0 h h
请注意,您在这里混合了数据类型,因此 columnC
中的值将是 class“字符”。
你可以试试:
data$columnC <- data$columnA
data$columnC[duplicated(data$columnA)]<-data$columnB[duplicated(data$columnA)]
columnA columnB columnC
1 1.0 a 1
2 2.0 b 2
3 3.0 c 3
4 1.1 d 1.1
5 2.2 e 2.2
6 3.3 f 3.3
7 1.0 g g
8 2.0 h h
试试这个
within(data, columnC <- ifelse(duplicated(columnA), columnB, columnA))
columnA columnB columnC
1 1.0 a 1
2 2.0 b 2
3 3.0 c 3
4 1.1 d 1.1
5 2.2 e 2.2
6 3.3 f 3.3
7 1.0 g g
8 2.0 h h
这是另一种选择。按 columnA 分组,如果我们看到第一次出现 A,则使用 A,否则使用 B。
library(tidyverse)
data <- tibble(columnA = c(1,2,3,1.1,2.2,3.3,1,2),
columnB =c("a","b","c","d","e","f","g","h"))
data %>%
group_by(columnA) %>%
mutate(columnC = ifelse(row_number() == 1, as.character(columnA), columnB))
#> # A tibble: 8 x 3
#> # Groups: columnA [6]
#> columnA columnB columnC
#> <dbl> <chr> <chr>
#> 1 1 a 1
#> 2 2 b 2
#> 3 3 c 3
#> 4 1.1 d 1.1
#> 5 2.2 e 2.2
#> 6 3.3 f 3.3
#> 7 1 g g
#> 8 2 h h
我有一个 data.frame 看起来像这样 -
columnA=c(1,2,3,1.1,2.2,3.3,1,2)
columnB=c("a","b","c","d","e","f","g","h")
data=data.frame(columnA, columnB)
columnA columnB
1 1.0 a
2 2.0 b
3 3.0 c
4 1.1 d
5 2.2 e
6 3.3 f
7 1.0 g
8 2.0 h
我想在 A 列中找到重复项并将它们替换为相同的元素 B 列中的行。我希望 C 列像这样
columnA columnB columnC
1 1.0 a 1.0
2 2.0 b 2.0
3 3.0 c 3.0
4 1.1 d 1.1
5 2.2 e 2.2
6 3.3 f 3.3
7 1.0 g g
8 2.0 h h
其中 A 列第 7 行和第 8 行重复 1.0 和 3.0 已替换为 B 列第 7 行和第 8 行中的相应元素 [g 和 h]
如有任何帮助,我们将不胜感激。纠结了好久。
您可以在 columnC
中复制 columnA
值,然后将 duplicated
值替换为 columnB
。
data$columnC <- data$columnA
inds <- duplicated(data$columnA)
data$columnC[inds] <- data$columnB[inds]
data
# columnA columnB columnC
#1 1.0 a 1
#2 2.0 b 2
#3 3.0 c 3
#4 1.1 d 1.1
#5 2.2 e 2.2
#6 3.3 f 3.3
#7 1.0 g g
#8 2.0 h h
请注意,您在这里混合了数据类型,因此 columnC
中的值将是 class“字符”。
你可以试试:
data$columnC <- data$columnA
data$columnC[duplicated(data$columnA)]<-data$columnB[duplicated(data$columnA)]
columnA columnB columnC
1 1.0 a 1
2 2.0 b 2
3 3.0 c 3
4 1.1 d 1.1
5 2.2 e 2.2
6 3.3 f 3.3
7 1.0 g g
8 2.0 h h
试试这个
within(data, columnC <- ifelse(duplicated(columnA), columnB, columnA))
columnA columnB columnC
1 1.0 a 1
2 2.0 b 2
3 3.0 c 3
4 1.1 d 1.1
5 2.2 e 2.2
6 3.3 f 3.3
7 1.0 g g
8 2.0 h h
这是另一种选择。按 columnA 分组,如果我们看到第一次出现 A,则使用 A,否则使用 B。
library(tidyverse)
data <- tibble(columnA = c(1,2,3,1.1,2.2,3.3,1,2),
columnB =c("a","b","c","d","e","f","g","h"))
data %>%
group_by(columnA) %>%
mutate(columnC = ifelse(row_number() == 1, as.character(columnA), columnB))
#> # A tibble: 8 x 3
#> # Groups: columnA [6]
#> columnA columnB columnC
#> <dbl> <chr> <chr>
#> 1 1 a 1
#> 2 2 b 2
#> 3 3 c 3
#> 4 1.1 d 1.1
#> 5 2.2 e 2.2
#> 6 3.3 f 3.3
#> 7 1 g g
#> 8 2 h h