我是R.的新人。我有这个数据框:
TimeStamp IndexA IndexB Value
12:00:01 1 NA Windows
12:00:05 1 NA Windows
12:00:13 1 NA Windows
12:00:48 NA 1 Macintosh
12:01:30 NA 1 Macintosh
12:01:45 NA 1 Macintosh
12:02:01 2 NA Windows
12:02:13 2 NA Windows
我想根据列IndexA
和Value
或IndexB
和Value
删除重复的行。所以,最后数据框应该是这样的:
TimeStamp IndexA IndexB Value
12:00:01 1 NA Windows
12:00:48 NA 1 Macintosh
12:02:01 2 NA Windows
我该如何管理?
答案 0 :(得分:4)
使用dplyr
的解决方案。我们可以使用distinct
函数。考虑重复时,-TimeStamp
是指定排除此列。 .keep_all = TRUE
表示保留所有列。
library(dplyr)
dt2 <- dt %>%
distinct(-TimeStamp, .keep_all = TRUE)
dt2
# # A tibble: 3 x 4
# TimeStamp IndexA IndexB Value
# <chr> <int> <int> <chr>
# 1 12:00:01 1 NA Windows
# 2 12:00:48 NA 1 Macintosh
# 3 12:02:01 2 NA Windows
数据
dt <- read.table(text = "TimeStamp IndexA IndexB Value
12:00:01 1 NA Windows
12:00:05 1 NA Windows
12:00:13 1 NA Windows
12:00:48 NA 1 Macintosh
12:01:30 NA 1 Macintosh
12:01:45 NA 1 Macintosh
12:02:01 2 NA Windows
12:02:13 2 NA Windows",
header = TRUE, stringsAsFactors = FALSE)
答案 1 :(得分:2)
为了完整起见,也可以使用unique()
包中的data.table
函数:
library(data.table)
unique(setDT(df), by = "IndexA")
TimeStamp IndexA IndexB Value 1: 12:00:01 1 NA Windows 2: 12:00:48 NA 1 Macintosh 3: 12:02:01 2 NA Windows
这仅在IndexA
中查找与Tito Sanz' answer相当的唯一值。显然,这种方法会返回给定样本数据集的预期结果,但只检查一个列中的重复条目会过度简化IMHO,并且可能会因生产数据而失败。
或者,在三个列(相当于www's answer)中查找值的唯一组合:
unique(setDT(df), by = 2:4) # very terse
unique(setDT(df), by = c("IndexA", "IndexB", "Value")) # explicitely named cols
TimeStamp IndexA IndexB Value 1: 12:00:01 1 NA Windows 2: 12:00:48 NA 1 Macintosh 3: 12:02:01 2 NA Windows
library(data.table)
df <- fread(
"TimeStamp IndexA IndexB Value
12:00:01 1 NA Windows
12:00:05 1 NA Windows
12:00:13 1 NA Windows
12:00:48 NA 1 Macintosh
12:01:30 NA 1 Macintosh
12:01:45 NA 1 Macintosh
12:02:01 2 NA Windows
12:02:13 2 NA Windows")
答案 2 :(得分:0)
您可以在distinct
包中使用tidyverse
功能。
foo %>%
distinct(IndexA, .keep_all = T)
结果如下:
TimeStamp IndexA IndexB Value
1 12:00:01 1 NA Windows
2 12:00:48 NA 1 Macintosh
3 12:02:01 2 NA Windows