1

R を使用して、2 列のデータ フレームがある場合:

meta <- c(1,2,2,3,4,4,4,5)
value <- c("a","b","c","d","e","f","g","h")
df <- data.frame(meta,value)
df
  meta value
1    1     a
2    2     b
3    2     c
4    3     d
5    4     e
6    4     f
7    4     g
8    5     h

結果のデータフレームが次のようになるように、「メタ」を繰り返して「値」を区切り文字(||など)と組み合わせるにはどうすればよいですか。

  meta   value
1    1       a
2    2    b||c
3    3       d
4    4 e||f||g
5    5       h

ありがとう!

4

4 に答える 4

4

わずかに異なり、かなり無駄がなく、基本的には次のとおりです。

y <- split(df$value, df$meta)
data.frame(meta=names(y), value=sapply(y, paste, collapse="||"))

またはさらに簡単:

aggregate(value~meta, df, paste, collapse="||")
于 2012-07-18T23:08:56.413 に答える
2

plyrパッケージを使用すると、次のように動作します

library(plyr)
> ldply(split(df,meta),function(x){paste(x$value,collapse="||")})
  .id      V1
1   1       a
2   2    b||c
3   3       d
4   4 e||f||g
5   5       h

また

> ddply(df,.(meta),function(x){c(value=paste(x$value,collapse="||"))})
  meta   value
1    1       a
2    2    b||c
3    3       d
4    4 e||f||g
5    5       h

名前を残したい場合

于 2012-07-18T21:56:38.513 に答える
2

data.frame(meta=unique(df$meta), value=sapply(unique(df$meta), function(m){ paste(df$value[which(df$meta) ==m)],collapse="||") }) )

> data.frame(meta=unique(df$meta),    value=sapply(unique(df$meta), function(m){ paste(df$value[which(df$meta==m)],collapse="||")  })  )
  meta   value
1    1       a
2    2    b||c
3    3       d
4    4 e||f||g
5    5       h
于 2012-07-18T22:09:38.653 に答える
0

ここに別の方法があります...

 uni.meta <- unique(df$meta)
    list <- lapply(1:length(uni.meta),function(x) which(df$meta==uni.meta[x]))
    new.value <- unlist(lapply(1:length(list),function(x) paste(df$value[list[[x]]],collapse="||")))
new.df <- data.frame(uni.meta,new.value)

new.df
  uni.meta new.value
1        1         a
2        2      b||c
3        3         d
4        4   e||f||g
5        5         h
于 2012-07-19T06:57:30.380 に答える