查找唯一行
Find unique rows
这看起来很简单,但我想不通。
给定这个数据框
df=data.frame(
x = c(12,12,165,165,115,148,148,155,155,521),
y = c(54,54,122,122,215,108,108,655,655,151)
)
df
x y
1 12 54
2 12 54
3 165 122
4 165 122
5 115 215
6 148 108
7 148 108
8 155 655
9 155 655
10 521 151
现在,我怎样才能得到只存在一次的行。那是第 5 行和第 10 行。行的顺序可以完全任意,因此检查 "next" 行不是一个选项。我尝试了很多东西,但在我的 data.frame 上没有任何效果,它有 ~40k 行。
我有一个解决方案处理我的 data.frame 的一个子集(~1k 行),处理时间为 3 分钟。因此,我的解决方案在我原来的 data.frame 上需要 120 分钟,这是不合适的。有人可以帮忙吗?
使用 dplyr
的解决方案。 df2
是最终输出。
library(dplyr)
df2 <- df %>%
count(x, y) %>%
filter(n == 1) %>%
select(-n)
table
的解决方案
library(dplyr)
table(df) %>% as.data.frame %>% subset(Freq ==1) %>% select(-3)
或者像你在评论中所说的那样使用 base 你不想加载包:
subset(as.data.frame(table(df)),Freq ==1)[,-3]
另外我认为 data.table
对于大数据集和过滤来说非常快,所以这可能也值得尝试,因为你提到了速度:
df2 <- copy(df)
df2 <- setDT(df2)[, COUNT := .N, by='x,y'][COUNT ==1][,c("x","y")]
从数据帧的开始和结束检查duplicated
,如果nonereturns为真,那么select就是:
df[!(duplicated(df) | duplicated(df, fromLast = TRUE)),]
# x y
#5 115 215
#10 521 151
另一个基础 R 解决方案,它使用 ave
来计算每一行的总出现次数,并且仅对出现 1
次的那些进行子集化。也可以修改它以对出现特定次数的行进行子集化。
df[ave(1:NROW(df), df, FUN = length) == 1,]
# x y
#5 115 215
#10 521 151
这看起来很简单,但我想不通。
给定这个数据框
df=data.frame(
x = c(12,12,165,165,115,148,148,155,155,521),
y = c(54,54,122,122,215,108,108,655,655,151)
)
df
x y
1 12 54
2 12 54
3 165 122
4 165 122
5 115 215
6 148 108
7 148 108
8 155 655
9 155 655
10 521 151
现在,我怎样才能得到只存在一次的行。那是第 5 行和第 10 行。行的顺序可以完全任意,因此检查 "next" 行不是一个选项。我尝试了很多东西,但在我的 data.frame 上没有任何效果,它有 ~40k 行。
我有一个解决方案处理我的 data.frame 的一个子集(~1k 行),处理时间为 3 分钟。因此,我的解决方案在我原来的 data.frame 上需要 120 分钟,这是不合适的。有人可以帮忙吗?
使用 dplyr
的解决方案。 df2
是最终输出。
library(dplyr)
df2 <- df %>%
count(x, y) %>%
filter(n == 1) %>%
select(-n)
table
library(dplyr)
table(df) %>% as.data.frame %>% subset(Freq ==1) %>% select(-3)
或者像你在评论中所说的那样使用 base 你不想加载包:
subset(as.data.frame(table(df)),Freq ==1)[,-3]
另外我认为 data.table
对于大数据集和过滤来说非常快,所以这可能也值得尝试,因为你提到了速度:
df2 <- copy(df)
df2 <- setDT(df2)[, COUNT := .N, by='x,y'][COUNT ==1][,c("x","y")]
从数据帧的开始和结束检查duplicated
,如果nonereturns为真,那么select就是:
df[!(duplicated(df) | duplicated(df, fromLast = TRUE)),]
# x y
#5 115 215
#10 521 151
另一个基础 R 解决方案,它使用 ave
来计算每一行的总出现次数,并且仅对出现 1
次的那些进行子集化。也可以修改它以对出现特定次数的行进行子集化。
df[ave(1:NROW(df), df, FUN = length) == 1,]
# x y
#5 115 215
#10 521 151