取决于一列重复的单独数据框

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)

我究竟做错了什么?或者有另一种方法可以做到这一点?

谢谢你的帮助!

Ron*_*hah 5

在基础 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]]可被视为dfSingledf1[[2]]作为dfMultiple