我尝试做一些简单的转置 - 我在数据集中有两列,如下所示:
+----+-------+-------+
| | 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
答案 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",]