我认为我有一个相对简单的问题,但无法弄清楚如何解决它。 我有以下数据框:
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
答案 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