332

次のデータフレームを再配置するのに問題があります。

set.seed(45)
dat1 <- data.frame(
    name = rep(c("firstName", "secondName"), each=4),
    numbers = rep(1:4, 2),
    value = rnorm(8)
    )

dat1
       name  numbers      value
1  firstName       1  0.3407997
2  firstName       2 -0.7033403
3  firstName       3 -0.3795377
4  firstName       4 -0.7460474
5 secondName       1 -0.8981073
6 secondName       2 -0.3347941
7 secondName       3 -0.5013782
8 secondName       4 -0.1745357

それぞれの一意の「名前」変数が行名であり、「値」がその行に沿った観測値であり、「数値」が列名であるように、形状を変更したいと思います。このようなもの:

     name          1          2          3         4
1  firstName  0.3407997 -0.7033403 -0.3795377 -0.7460474
5 secondName -0.8981073 -0.3347941 -0.5013782 -0.1745357

私は他のいくつかのことを見てきましたmeltcast、どれもその仕事をしていないようです。

4

12 に答える 12

324

使用reshape機能:

reshape(dat1, idvar = "name", timevar = "numbers", direction = "wide")
于 2011-05-04T23:20:03.083 に答える
83

reshape()関数、またはreshape パッケージのmelt()/関数を使用してこれを行うことができます。cast()2 番目のオプションの場合、コード例は次のとおりです。

library(reshape)
cast(dat1, name ~ numbers)

または使用してreshape2

library(reshape2)
dcast(dat1, name ~ numbers)
于 2011-05-04T22:42:14.810 に答える
29

サンプルデータフレームを使用すると、次のことができます。

xtabs(value ~ name + numbers, data = dat1)
于 2011-05-04T22:58:48.690 に答える
23

他の 2 つのオプション:

基本パッケージ:

df <- unstack(dat1, form = value ~ numbers)
rownames(df) <- unique(dat1$name)
df

sqldfパッケージ:

library(sqldf)
sqldf('SELECT name,
      MAX(CASE WHEN numbers = 1 THEN value ELSE NULL END) x1, 
      MAX(CASE WHEN numbers = 2 THEN value ELSE NULL END) x2,
      MAX(CASE WHEN numbers = 3 THEN value ELSE NULL END) x3,
      MAX(CASE WHEN numbers = 4 THEN value ELSE NULL END) x4
      FROM dat1
      GROUP BY name')
于 2015-07-14T17:44:08.150 に答える
0

とのみdplyrを使用しmapます。

library(dplyr)
library(purrr)
set.seed(45)
dat1 <- data.frame(
  name = rep(c("firstName", "secondName"), each=4),
  numbers = rep(1:4, 2), value = rnorm(8)
)
longer_to_wider <- function(data, name_from, value_from){
  group <- colnames(data)[!(colnames(data) %in% c(name_from,value_from))]
  data %>% group_by(.data[[group]]) %>%
    summarise( name = list(.data[[name_from]]), 
               value = list(.data[[value_from]])) %>%
    {
      d <- data.frame(
        name = .[[name_from]] %>% unlist() %>% unique()
      )
      e <- map_dfc(.[[group]],function(x){
          y <- data_frame(
            x = data %>% filter(.data[[group]] == x) %>% pull(value_from)
          )
          colnames(y) <- x
          y
      })
      cbind(d,e)
    }
}
longer_to_wider(dat1, "name", "value")
#    name          1          2          3          4
# 1  firstName  0.3407997 -0.7033403 -0.3795377 -0.7460474
# 2 secondName -0.8981073 -0.3347941 -0.5013782 -0.1745357
于 2021-11-02T15:36:29.123 に答える