在R中使用聚合函数找到一个变量的唯一值,这些值与另一个变量的相同值对应。

3

我想在这个数据框中应用聚合函数:

A <- data.frame(c(1:2,1:2,2),c("a","c","b","c","d"))
colnames(A) <- c("ola","hi")
A

> A
  ola hi
1   1  a
2   2  c
3   1  b
4   2  c
5   2  d

获取具有A$ola有序值和相应唯一A$hi值的A,如下所示:

A <- data.frame(c(1:2),c("a,b","c,d"))
colnames(A) <- c("ola","hi")
> A
  ola  hi
1   1 a,b
2   2 c,d

我尝试了这段代码:

aggregate(A, by=list(A$ola), FUN=unique)

但它会返回以下结果:
  Group.1 ola hi.1 hi.2
1       1   1    a    b
2       2   2    c    d

请问有人能解释一下我做错了什么吗?

(涉及IT技术)

我无法重现你的精确结果。 你确定你展示的代码与你在计算中使用的完全一样吗?例如,“A”的输出与定义“A”的代码不相符。你应该在data.frame中使用stringsAsFactors = FALSE。我更喜欢使用aggregate的公式版本。试试这个:aggregate(hi ~ ola, data = A, FUN = unique) - Stibu
你是对的。定义A的代码现在已经被修正了。 - salamandra
3个回答

6
除了使用paste方法外,如果我们想将“hi”列作为一个list
r1 <- aggregate(hi~ola, unique(A), FUN=list)
r1
#  ola   hi
#1   1 a, b
#2   2 c, d

这位OP的代码会生成一个 data.frame

r2 <- aggregate(hi~ola, A, FUN=unique)
r2
#  ola hi.1 hi.2
#1   1    a    b
#2   2    c    d

有两列,第二列是一个名为“hi”的 矩阵

str(r2)
#'data.frame':  2 obs. of  2 variables:
#$ ola: int  1 2
#$ hi : chr [1:2, 1:2] "a" "c" "b" "d"

2

如果你真的想要一个包含唯一项文本的列,你需要使用更复杂的函数。

uniqCSV <- function(x) { paste(unique(x), sep = ',') }
aggregate(hi ~ ola, data = A, FUN= uniqCSV)

2

另一个选择:

library(dplyr)
distinct(A) %>% group_by(ola) %>% summarise(hi = toString(hi))

这将会得到:

#Source: local data frame [2 x 2]
#
#    ola    hi
#  (int) (chr)
#1     1  a, b
#2     2     c

数据

A <- structure(list(ola = c(1L, 2L, 1L, 2L), hi = structure(c(1L, 
3L, 2L, 3L), .Label = c("a", "b", "c"), class = "factor")), .Names = c("ola", 
"hi"), row.names = c(NA, -4L), class = "data.frame")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接