根据另一列删除一列中的重复行并保持其他列不变
Posted
技术标签:
【中文标题】根据另一列删除一列中的重复行并保持其他列不变【英文标题】:Remove duplicate rows in one column based on another column and keep other columns intact 【发布时间】:2018-03-24 19:11:20 【问题描述】:我已经尝试了很多在这里找到的解决方案,但没有一个可以正常工作; unique
函数让我最接近。我的数据如下:
id second var1 var2
100 20 3 4
100 21 3 3
100 22 4 3
100 23 4 3
100 24 4 4
100 22 3 3
100 23 3 3
它通常每 300 秒左右重复大约 10 秒。每个会话大约是 1200 秒。我想在会话中删除重复的秒数,并取 var1 和 var 2 中被折叠的任何内容的平均值,或者如果不是保持原始值的平均值,则可以。如果 var1 和 var2 不唯一,我尝试过的所有操作都会删除重复项?
【问题讨论】:
aggregate(. ~ id+second, mydata, mean)
【参考方案1】:
这将创建一个符合您要求的新数据框。
解释一下,你实际上不需要删除任何东西,你只需要按公共值分组 val1/2s,在本例中为 id 和 second。
library(tidyverse)
new_df <- df %>%
group_by(id, second) %>%
summarise(var1 = mean(var1),
var2 = mean(var2)
)
【讨论】:
【参考方案2】:您可以使用base-R
函数来做到这一点:
aggregate(. ~ id+second, dat, mean)
## id second var1 var2
## 1 100 20 3.0 4
## 2 100 21 3.0 3
## 3 100 22 3.5 3
## 4 100 23 3.5 3
## 5 100 24 4.0 4
使用dplyr
包可以完成(类似于以前的答案,稍作调整):
library(dplyr)
dat %>% group_by(id, second) %>%
summarise_all(mean)
## # A tibble: 5 x 4
## # Groups: id [?]
## id second var1 var2
## <int> <int> <dbl> <dbl>
## 1 100 20 3.0 4
## 2 100 21 3.0 3
## 3 100 22 3.5 3
## 4 100 23 3.5 3
## 5 100 24 4.0 4
如果您想根据两列(键)删除重复项,data.table
包将是一个不错的选择:
library(data.table)
unique(setDT(dat), by = c('id','second'))
# id second var1 var2
# 1: 100 20 3 4
# 2: 100 21 3 3
# 3: 100 22 4 3
# 4: 100 23 4 3
# 5: 100 24 4 4
数据:
dat <- structure(list(id = c(100L, 100L, 100L, 100L, 100L, 100L, 100L
), second = c(20L, 21L, 22L, 23L, 24L, 22L, 23L), var1 = c(3L,
3L, 4L, 4L, 4L, 3L, 3L), var2 = c(4L, 3L, 3L, 3L, 4L, 3L, 3L)), .Names = c("id",
"second", "var1", "var2"), .internal.selfref = <pointer: 0x02af24a0>, row.names = c(NA,
7L), class = c("data.table", "data.frame"))
【讨论】:
以上是关于根据另一列删除一列中的重复行并保持其他列不变的主要内容,如果未能解决你的问题,请参考以下文章
根据另一列中的值删除一列的重复项,Python,Pandas
在C#中进行DataTable操作:根据列数据插入一些汇总行