我正在将一些SAS代码转换为R并且卡在一部分上以将最终数据输出重新整形为新格式。我有一个数据框,df,看起来像这样:
State AREA Year species ncount_ip est.ip se.ip est.tib se.tib
1 CT 12593 2015 ABDU 56 1349.250 943.2464 4497.50 2871.4829
2 CT 12593 2015 GADW 56 224.875 224.3744 6746.25 6290.3472
3 CT 12593 2015 COME 56 0.000 0.0000 0.00 0.0000
4 VT 12593 2015 ABDU 56 8545.250 1756.8546 19114.38 5443.0618
5 VT 12593 2015 COME 56 674.625 498.0543 1349.25 996.1086
6 VT 12593 2015 GADW 56 224.875 224.3744 449.75 448.7489
我想用这样的格式(最终):
Species Type Year VTest VTse CTest CTse
GADW Pop 2015 449.75 448.7489 6746.25 6290.3472
GADW Pairs 2015 224.875 224.3744 224.875 224.3744
ABDU Pop 2015 19114.38 5443.0618 4497.50 2871.4829
ABDU Pairs 2015 8545.250 1756.8546 1349.250 943.2464
COME Pop 2015 1349.25 996.1086 0.00 0.00
COME Pairs 2015 674.625 498.0543 0.00 0.00
基本上,我需要从df中获取pop的估计值(est)和标准误差(se)。 (.tib)和每个状态的对(.ip)(在示例中仅给出2但实际数据集中约为10),为每个物种形成2行,每个状态有2列,以创建最终状态。
我开始尝试包装重塑和熔化,但不能完全得到我需要的东西。我认为在融化后按州重新命名可能会有效,但无法对其进行适当的编码。谢谢你的时间和帮助。
答案 0 :(得分:1)
从您的df
开始,并使用reshape2
包,首先融合数据框,保留前5列:
> library(reshape2)
> melted <- melt(df, id.vars=1:5)
> head(melted)
State AREA Year species ncount_ip variable value
1 CT 12593 2015 ABDU 56 est.ip 1349.250
2 CT 12593 2015 GADW 56 est.ip 224.875
3 CT 12593 2015 COME 56 est.ip 0.000
4 VT 12593 2015 ABDU 56 est.ip 8545.250
5 VT 12593 2015 COME 56 est.ip 674.625
6 VT 12593 2015 GADW 56 est.ip 224.875
使用colsplit
从新的variable
列(旧标题)中提取统计信息和类型标识符,并将这些列添加到dataframe:
> melted <- cbind(melted,
+ colsplit(melted$variable, "\\.", c('stat','type')))
> head(melted)
State AREA Year species ncount_ip variable value stat type
1 CT 12593 2015 ABDU 56 est.ip 1349.250 est ip
2 CT 12593 2015 GADW 56 est.ip 224.875 est ip
3 CT 12593 2015 COME 56 est.ip 0.000 est ip
4 VT 12593 2015 ABDU 56 est.ip 8545.250 est ip
5 VT 12593 2015 COME 56 est.ip 674.625 est ip
6 VT 12593 2015 GADW 56 est.ip 224.875 est ip
结合State
和stat
来获得所需的标签,并替换type
中的字符串:
> melted$state_stat <- paste(melted$State, melted$stat, sep ="_")
> melted$type <- gsub("tib", "Pop", melted$type)
> melted$type <- gsub("ip", "Pairs", melted$type)
> head(melted)
State AREA Year species ncount_ip variable value stat type state_stat
1 CT 12593 2015 ABDU 56 est.ip 1349.250 est Pairs CT_est
2 CT 12593 2015 GADW 56 est.ip 224.875 est Pairs CT_est
3 CT 12593 2015 COME 56 est.ip 0.000 est Pairs CT_est
4 VT 12593 2015 ABDU 56 est.ip 8545.250 est Pairs VT_est
5 VT 12593 2015 COME 56 est.ip 674.625 est Pairs VT_est
6 VT 12593 2015 GADW 56 est.ip 224.875 est Pairs VT_est
使用新的state_stat
列列重新构建数据框:
> final <- dcast(melted, Year+species+type~state_stat, value.var="value")
> final
Year species type CT_est CT_se VT_est VT_se
1 2015 ABDU Pairs 1349.250 943.2464 8545.250 1756.8546
2 2015 ABDU Pop 4497.500 2871.4829 19114.380 5443.0618
3 2015 COME Pairs 0.000 0.0000 674.625 498.0543
4 2015 COME Pop 0.000 0.0000 1349.250 996.1086
5 2015 GADW Pairs 224.875 224.3744 224.875 224.3744
6 2015 GADW Pop 6746.250 6290.3472 449.750 448.7489