use*_*411 1 r subset duplicates dataframe
我有一个包含很多行和列的大型数据框。在一列中有字符,其中一些只出现一次,另一些则出现多次。我现在想分离整个数据框,这样我最终会得到两个数据框,一个是所有行的字符在这一列中重复,另一个是所有行的字符只出现一次. 例如:
One = c(1,2,3,4,5,6,7,8,9,10)
Two = c(4,5,3,6,2,7,1,8,1,9)
Three = c("a", "b", "c", "d","d","e","f","e","g","c")
df <- data.frame(One, Two, Three)
> df
One Two Three
1 1 4 a
2 2 5 b
3 3 3 c
4 4 6 d
5 5 2 d
6 6 7 e
7 7 1 f
8 8 8 e
9 9 1 g
10 10 9 c
Run Code Online (Sandbox Code Playgroud)
我希望有两个数据框,比如
> dfSingle
One Two Three
1 1 4 a
2 2 5 b
7 7 1 f
9 9 1 g
> dfMultiple
One Two Three
3 3 3 c
4 4 6 d
5 5 2 d
6 6 7 e
8 8 8 e
10 10 9 c
Run Code Online (Sandbox Code Playgroud)
我尝试使用该duplicated()功能
dfSingle = subset(df, !duplicated(df$Three))
dfMultiple = subset(df, duplicated(df$Three))
Run Code Online (Sandbox Code Playgroud)
但它不起作用,因为“c”、“d”和“e”中的第一个转到“dfSingle”。我也尝试做一个 for 循环
MulipleValues = unique(df$Three[c(which(duplicated(df$Three)))])
dfSingle = data.frame()
x = 1
dfMultiple = data.frame()
y = 1
for (i in 1:length(df$One)) {
if(df$Three[i] %in% MulipleValues){
dfMultiple[x,] = df[i,]
x = x+1
} else {
dfSingle[y,] = df[i,]
y = y+1
}
}
Run Code Online (Sandbox Code Playgroud)
它似乎做正确的事情,因为数据框现在有正确的行数,但它们不知何故有 0 列。
> dfSingle
data frame with 0 columns and 4 rows
> dfMultiple
data frame with 0 columns and 6 rows
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?或者有另一种方法可以做到这一点?
谢谢你的帮助!
在基础 R 中,我们可以使用splitwith duplicatedwhich 将返回两个数据框的列表。
df1 <- split(df, duplicated(df$Three) | duplicated(df$Three, fromLast = TRUE))
df1
#$`FALSE`
# One Two Three
#1 1 4 a
#2 2 5 b
#7 7 1 f
#9 9 1 g
#$`TRUE`
# One Two Three
#3 3 3 c
#4 4 6 d
#5 5 2 d
#6 6 7 e
#8 8 8 e
#10 10 9 c
Run Code Online (Sandbox Code Playgroud)
这里df1[[1]]可被视为dfSingle和df1[[2]]作为dfMultiple。