列出一列与另一列的值

时间:2014-02-10 20:03:05

标签: r

我认为我有一个相对简单的问题,但无法弄清楚如何解决它。 我有以下数据框:

a <- c("A","B","C","C","D","D","E")
b <- c(1,2,3,4,5,6,7)
c <- data.frame(a,b)

现在我想要一个新的数据框,列出像这样

的单元格中所有b的值
A;1
B;2
c;3,4
D;5,6
E;7

有人能指出我正确的方向吗?我正在看ddply,其中一列为max(b),另一列为min(b),然后将列粘贴在一起,但它给出了错误:

Error in .fun(piece, ...) : argument is missing, with no default

4 个答案:

答案 0 :(得分:3)

使用tapply

tapply(c$b, c$a, function(x) paste(x, collapse  =','))
#    A     B     C     D     E 
#  "1"   "2" "3,4" "5,6"   "7" 

答案 1 :(得分:3)

只需使用基数为R的split()即可。使用数据框中的数据df

df <- data.frame(a = c("A","B","C","C","D","D","E"), b = c(1,2,3,4,5,6,7))

您想要的解决方案是with(df, split(b, a))

R> with(df, split(b, a))
$A
[1] 1

$B
[1] 2

$C
[1] 3 4

$D
[1] 5 6

$E
[1] 7

现在这是一个列表,你想要一个数据帧,但如果没有以某种方式连接信息,这是不可能的,因为数据帧中的每个元素必须具有相同的长度。如果你想将它作为一个向量,只需要paste()个元素:

sapply(with(df, split(b, a)),  paste, collapse = ",")

R> sapply(with(df, split(b, a)),  paste, collapse = ",")
    A     B     C     D     E 
  "1"   "2" "3,4" "5,6"   "7"

答案 2 :(得分:1)

使用plyr

ddply(c, .(a), summarise, bs=list(b))

现在,您生成的data.frame有一列bs,每个元素都是一个列表。

FWIW,知道为什么要以这种方式构建数据可能会提供信息。通常R有一些设施可以让你避免这种类型的操作,并使代码更清晰,更易理解......

答案 3 :(得分:0)

您是否希望字母以及唯一元素包含在新data.frame的行中?

v  <- tapply(b,a, unique)
data.frame(new_df = unlist(lapply(seq_along(v), 
           function(i) paste(names(v)[[i]], paste(v[[i]], collapse = ","), sep = ";"))))

#  new_df
#1    A;1
#2    B;2
#3  C;3,4
#4  D;5,6
#5    E;7