使用库 reshape2 或类似库重塑 R 中的数据框
Reshape dataframe in R with library reshape2 or similar
我有这样的数据框:
Id Date
1 12.3.2011
1 22.2.2012
1 15.8.2015
2 2.7.2017
2 2.10.2017
3 1.9.2014
3 31.1.2015
3 11.11.2016
如何在 R 中像这样获取数据帧:
Id Date_1 Date_2 Date_3
1 12.3.2011 22.2.2012 15.8.2015
2 2.7.2017 2.10.2017
3 1.9.2014 31.1.2015 11.11.2016
谢谢!
基于dplyr
和tidyr
的解决方案。
library(dplyr)
library(tidyr)
dt2 <- dt %>%
group_by(Id) %>%
mutate(Number = paste0("Date", 1:n())) %>%
spread(Number, Date)
dt2
# A tibble: 3 x 4
# Groups: Id [3]
Id Date1 Date2 Date3
* <int> <chr> <chr> <chr>
1 1 12.3.2011 22.2.2012 15.8.2015
2 2 2.7.2017 2.10.2017 <NA>
3 3 1.9.2014 31.1.2015 11.11.2016
或者使用 reshape2
包中的 dcast
函数。
library(dplyr)
library(reshape2)
dt2 <- dt %>%
group_by(Id) %>%
mutate(Number = paste0("Date", 1:n())) %>%
dcast(Id ~ Number, value.var = "Date")
dt2
Id Date1 Date2 Date3
1 1 12.3.2011 22.2.2012 15.8.2015
2 2 2.7.2017 2.10.2017 <NA>
3 3 1.9.2014 31.1.2015 11.11.2016
或者使用 data.table
包。
dt_temp <- as.data.table(dt)
dt_temp2 <- dt_temp[, Number := paste0("Date", as.character(1:.N)), by = Id]
dcast(dt_temp2, Id ~ Number, value.var = "Date")
Id Date1 Date2 Date3
1: 1 12.3.2011 22.2.2012 15.8.2015
2: 2 2.7.2017 2.10.2017 NA
3: 3 1.9.2014 31.1.2015 11.11.2016
数据
dt <- read.table(text = "Id Date
1 12.3.2011
1 22.2.2012
1 15.8.2015
2 2.7.2017
2 2.10.2017
3 1.9.2014
3 31.1.2015
3 11.11.2016",
header = TRUE, stringsAsFactors = FALSE)
我有这样的数据框:
Id Date
1 12.3.2011
1 22.2.2012
1 15.8.2015
2 2.7.2017
2 2.10.2017
3 1.9.2014
3 31.1.2015
3 11.11.2016
如何在 R 中像这样获取数据帧:
Id Date_1 Date_2 Date_3
1 12.3.2011 22.2.2012 15.8.2015
2 2.7.2017 2.10.2017
3 1.9.2014 31.1.2015 11.11.2016
谢谢!
基于dplyr
和tidyr
的解决方案。
library(dplyr)
library(tidyr)
dt2 <- dt %>%
group_by(Id) %>%
mutate(Number = paste0("Date", 1:n())) %>%
spread(Number, Date)
dt2
# A tibble: 3 x 4
# Groups: Id [3]
Id Date1 Date2 Date3
* <int> <chr> <chr> <chr>
1 1 12.3.2011 22.2.2012 15.8.2015
2 2 2.7.2017 2.10.2017 <NA>
3 3 1.9.2014 31.1.2015 11.11.2016
或者使用 reshape2
包中的 dcast
函数。
library(dplyr)
library(reshape2)
dt2 <- dt %>%
group_by(Id) %>%
mutate(Number = paste0("Date", 1:n())) %>%
dcast(Id ~ Number, value.var = "Date")
dt2
Id Date1 Date2 Date3
1 1 12.3.2011 22.2.2012 15.8.2015
2 2 2.7.2017 2.10.2017 <NA>
3 3 1.9.2014 31.1.2015 11.11.2016
或者使用 data.table
包。
dt_temp <- as.data.table(dt)
dt_temp2 <- dt_temp[, Number := paste0("Date", as.character(1:.N)), by = Id]
dcast(dt_temp2, Id ~ Number, value.var = "Date")
Id Date1 Date2 Date3
1: 1 12.3.2011 22.2.2012 15.8.2015
2: 2 2.7.2017 2.10.2017 NA
3: 3 1.9.2014 31.1.2015 11.11.2016
数据
dt <- read.table(text = "Id Date
1 12.3.2011
1 22.2.2012
1 15.8.2015
2 2.7.2017
2 2.10.2017
3 1.9.2014
3 31.1.2015
3 11.11.2016",
header = TRUE, stringsAsFactors = FALSE)