web-dev-qa-db-ja.com

Rのdplyr mutate-列の連結として列を追加

データフレームに新しい列を追加する目的でmutate{dplyr}関数を使用すると問題が発生します。新しい列が文字型であり、他の列(文字型でもある)からのソートされた単語の「連結」で構成されるようにします。たとえば、次のデータフレームの場合:

> library(datasets)
> states.df <- data.frame(name = as.character(state.name),
+                         region = as.character(state.region),
+                         division = as.character(state.division))
> 
> head(states.df, 3)
     name region           division
1 Alabama  South East South Central
2  Alaska   West            Pacific
3 Arizona   West           Mountain 

次の最初の要素を持つ新しい列を取得したいと思います。

"Alamaba_East South Central_South" 

私はこれを試しました:

mutate(states.df,
   concated_column = paste0(sort(name, region, division), collapse="_"))

しかし、エラーが発生しました:

Error in sort(1:50, c(2L, 4L, 4L, 2L, 4L, 4L, 1L, 2L, 2L, 2L, 4L, 4L,  : 
  'decreasing' must be a length-1 logical vector.
Did you intend to set 'partial'?

事前に助けてくれてありがとう!

26
Marta Karas

sep =ではなくcollapse =を使用する必要がありますが、なぜsortを使用するのですか?そして、paste0ではなくpasteを使用しました。

library(dplyr)
states.df <- data.frame(name = as.character(state.name),
                        region = as.character(state.region), 
                        division = as.character(state.division))
res = mutate(states.df,
   concated_column = paste(name, region, division, sep = '_'))

ソートに関する限り、sortを正しく使用していません。たぶんあなたがしたい:

as.data.frame(lapply(states.df, sort))

これにより、各列がソートされ、それらの列で新しいdata.frameが作成されます。

28
Paul Hiemstra

ポールの答えに加えて。行を並べ替えるには、 order を試してください。以下に例を示します。

res1 <- mutate(states.df,
          concated_column = apply(states.df[order(name, region, division), ], 1, 
                                  function(x) paste0(x, collapse = "_")))

ここで、順序はdata.frame states.dfを名前でソートし、次に地域と部門でタイを分割します

2
Ray