[英]Extracting data from data frame
我有一個看起來像這樣的數據框:
Code ID X1 X2
1 1000 2 1.6 250.6
2 1000 3 0.15 340.9
3 1001 2 0.53 441.7
4 1001 3 1.8 499.0
5 1002 2 4.4 516.6
6 1003 3 4.9 616.6
我想做的是創建一個具有唯一代碼且每個唯一ID作為一列(有兩個唯一ID:2和3)的X數據幀,並帶有相應的X1和X2值,因此結果應如下所示:
Code ID2X1 ID2X2 ID3X1 ID3X2
1 1000 1.6 250.6 0.15 340.9
2 1001 0.53 441.7 1.8 499.0
5 1002 4.4 516.6 NA NA
6 1003 NA NA 4.9 616.6
我使用“唯一”函數來提取唯一代碼,因此我擁有第一列,但沒有想到提取數據的有效方法。 請注意,某些代碼沒有ID2或ID3的值。
使用dplyr
和tidyr
library(dplyr)
library(tidyr)
mydf%>%
gather(Var, Val, X1:X2) %>%
mutate(IDVar=paste0("ID", ID, Var)) %>%
select(-ID, -Var) %>%
spread(IDVar, Val)
# Code ID2X1 ID2X2 ID3X1 ID3X2
#1 1000 1.60 250.6 0.15 340.9
#2 1001 0.53 441.7 1.80 499.0
#3 1002 4.40 516.6 NA NA
#4 1003 NA NA 4.90 616.6
這是一個基本的reshape
問題,從“長”重塑為“寬”。
嘗試以下操作(假設您的data.frame
稱為“ mydf”):
reshape(mydf, idvar="Code", timevar="ID", direction = "wide")
# Code X1.2 X2.2 X1.3 X2.3
# 1 1000 1.60 250.6 0.15 340.9
# 3 1001 0.53 441.7 1.80 499.0
# 5 1002 4.40 516.6 NA NA
# 6 1003 NA NA 4.90 616.6
這是使用reshape2
包的另一個選項:
dat = read.table(text=" Code ID X1 X2
1 1000 2 1.6 250.6
2 1000 3 0.15 340.9
3 1001 2 0.53 441.7
4 1001 3 1.8 499.0
5 1002 2 4.4 516.6
6 1003 3 4.9 616.6",header=TRUE)
library(reshape2)
# Melt to long format.
dat.m = melt(dat, id.var=c("Code","ID"))
# Combine "ID" and "variable" into a single column
dat.m$IDvar = paste0("ID", dat.m$ID, dat.m$variable)
# Remove uneeded columns
dat.m = dat.m[ , c("Code","IDvar", "value")]
# Cast to wide format
dat.w = dcast(dat.m, Code ~ IDvar, value.var="value")
dat.w
Code ID2X1 ID2X2 ID3X1 ID3X2
1 1000 1.60 250.6 0.15 340.9
2 1001 0.53 441.7 1.80 499.0
3 1002 4.40 516.6 NA NA
4 1003 NA NA 4.90 616.6
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.