在r中转置一个简单的数据集

时间:2018-02-01 22:37:33

标签: r

我尝试做一些简单的转置 - 我在数据集中有两列,如下所示:

+----+-------+-------+
|    | key   | value |
|    | <int> | <dbl> |
|  1 | 4181  | 28    |
|  2 | 4181  | 48    |
|  3 | 1229  | 20    |
|  4 | 1229  | 41    |
|  5 | 3302  | 76    |
|  6 | 3302  | 111   |
|  7 | 4105  | 83    |
|  8 | 4105  | 44    |
|  9 | 6544  | 18    |
| 10 | 6544  | 43    |
+----+-------+-------+

我希望密钥成为列和填充结果单元格的值。每个键变量的唯一实例有400条记录。我无法通过传播或重塑来实现这一目标。 Spread告诉我有重复的值,所以我不能理解函数是如何工作的。

编辑:我意识到我的解释和数据集不清楚。键列具有重复的标识符,但它们都具有相同数量的相应值(键列中的每个数字都显示400次,值列中包含相应的数字)。这就是我在使用dplyr :: spread时遇到问题的原因。我希望我的输出看起来如下所示:

  4181 1229 3302 4105 6544
1 28   20   76   83   18    
2 48   41   111  44   43

3 个答案:

答案 0 :(得分:3)

传播function from 'tidyr可以解决问题。

#Data 
 df <-  read.table(text = "key value
    4181    28
    1122    48
    1229    20
    4622    41
    3302    76
     130   111
    4105    83
    2612    44
    6544    18
   136    43", header = TRUE, stringsAsFactors = FALSE)

library(tidyr)
> spread(df, key, value)
#  130 136 1122 1229 2612 3302 4105 4181 4622 6544
$1 111  43   48   20   44   76   83   28   41   18

The key value has been changed to columns and value has been assigned properly. 

答案 1 :(得分:2)

使用unstack的基础R中的解决方案:

t(unstack(rev(df)));
#    130 136 1122 1229 2612 3302 4105 4181 4622 6544
#res 111  43   48   20   44   76   83   28   41   18

更新

要处理重复的密钥,请参阅dplyr / tidyr解决方案:

library(tidyverse);
df %>% group_by(key) %>% mutate(i = row_number()) %>% spread(key, value) %>% select(-i);
## A tibble: 2 x 5
#  `1229` `3302` `4105` `4181` `6544`
#   <int>  <int>  <int>  <int>  <int>
#1     20     76     83     28     18
#2     41    111     44     48     43

# Sample data
df <- read.table(text =
    "     key    value
      1  4181   28
      2  4181   48
      3  1229   20
      4  1229   41
      5  3302   76
      6  3302   111
      7  4105   83
      8  4105   44
      9  6544   18
     10  6544   43 ", header = T, row.names = 1)

说明:按key分组,对每个组中的行进行编号,然后将spread编号为宽,并删除组内行号。

答案 2 :(得分:1)

我认为您的意思是希望列名(或标题)成为关键。此时,R的转置功能t()将为您完成工作。

#Set up example data frame
key = seq(1,5)
value = round(runif(5)*100)
myDf <- data.frame(key,value)

#Transpose dataframe. This makes it a matrix so we convert it back into a data frame.
myDf <- as.data.frame(t(myDf))

#This creates two rows, one with key one with value

#If you want the column NAMES to be the key, then we can set the names to key, and drop the row containing the key
names(myDf) <- myDf["key",]
myDf <- myDf["value",]