我有一個如下所示的 df:
ID LOC
1 A
1 A
2 A
2 B
3 A
3 A
3 A
4 A
4 B
4 C
我想要做的是將 LOC 值折疊為每個 ID 的一行,如果它們相同,則將其保留為一個值,因此我的輸出將是:
ID LOC
1 A
2 A B
3 A
4 A B C
現在我正在使用:
group_by(ID) %>%
mutate(concat_LOC = paste0(LOC, collapse = " "))
即使它們相同,它也會連接所有值
uj5u.com熱心網友回復:
- 你正在減少/總結,所以你應該使用
summarize而不是mutate. - 由于您確實想要重復
LOC值,請使用unique.
dat %>%
group_by(ID) %>%
summarize(LOC = paste(unique(LOC), collapse = " ")) %>%
ungroup()
# # A tibble: 4 x 2
# ID LOC
# <int> <chr>
# 1 1 A
# 2 2 A B
# 3 3 A
# 4 4 A B C
uj5u.com熱心網友回復:
在 R 中有很多方法可以給貓剝皮,這里是 Base、tidyverse 和 data.table 的方式:
# Base R solution: res => data.frame
res <- aggregate(
LOC ~ ID,
df,
FUN = function(x){
paste0(unique(x), collapse = ' ')
}
)
# Output data.frame to console: data.frame => stdout(console)
res
# Tidyverse method: tv_res => tibble
library(tidyverse)
tv_res <- df %>%
group_by(ID) %>%
distinct() %>%
summarise(LOC = str_c(LOC, collapse = ' ')) %>%
ungroup()
# Print the data.frame to the console:
# tibble => stdout(console)
tv_res
# Data.table method:
# Coerce data.frame to data.table: dt => data.table object
dt <- data.table(df)
# Aggregate the data.table: dt_res => data.table object
dt_res <- dt[,
list(LOC = paste(unique(LOC), collapse = ' ')),
by = ID]
# Print the data to the console: data.table => console(stdout)
dt_res
使用的資料:
# Import the data: df => data.frame
df <- structure(list(ID = c(1L, 1L, 2L, 2L, 3L, 3L, 3L, 4L, 4L, 4L),
LOC = c("A", "A", "A", "B", "A", "A", "A", "A", "B", "C")),
class = "data.frame", row.names = c(NA, -10L))
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/325662.html
上一篇:用R中的=連接兩個向量
