从数据框中提取数据

时间:2014-07-07 17:11:25

标签: r dataframe reshape

我有一个如下所示的数据框:

    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),以及相应的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的值。

3 个答案:

答案 0 :(得分:1)

使用dplyrtidyr

 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

答案 1 :(得分:0)

这是一个基本的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

答案 2 :(得分:0)

这是使用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