所以这就是我想要做的。我有一个数据集,其中所有结果都列在一列中,但观察它们的步骤和用于观察它们的方法在不同的列中。有多个站点,我将其视为唯一标识符。并不是每个站点都有相同数量的步骤或方法,也不是每个方法都是在每个步骤中完成的。例如,站点a1可以在每个步骤处具有步骤s1-s5和方法m1-m25,而站点a9可以具有步骤s1-s15,但仅具有方法m3-m9。基本上,给定的站点/步骤/方法可能缺少数据。并不是每个站点都有每个步骤,也不是每个步骤都有每个方法。原始数据集看起来有点像这样:
site step method outcome
a1 S 1 m1 5
a1 S 1 m2 1
a1 S 2 m6 4
a2 S 1 m6 1a
a2 S 1 m4 3
a2 S 3 m7 2
a2 S 4 m2 7
a3 S 1 m1 2a
a3 S 1 m2 c11
a4 S 1 m4 2
a4 S 2 m2 5
a5 S 3 m3 6
a6 S 2 m1 7
a6 S 3 m4 8 结果有一些数值和字符值,具体取决于方法
step是唯一真正的"time“变量,但我觉得我也需要让r将方法视为一个变量。现在的数据有很多行,只有这几列,而现在数据的设置方式让我很难对其进行任何分析。
我按如下方式使用了reshape (我已经尝试过其他reshape语句,但这只是一个例子),我不会让我不幸地使用2个时间变量
mydata<-reshape(rawdata,idvar="site",timevar="step",direction="wide")
site method.S 1 outcome.S 1 method.S 2 outcome.S 2 method.S 3 outcome.S 3
1 a1 m1 5 m6 4 <NA> NA
4 a2 m6 1 <NA> NA m7 2
8 a3 m1 2 <NA> NA <NA> NA
10 a4 m4 2 m2 5 <NA> NA
12 a5 <NA> NA <NA> NA m3 6
13 a6 <NA> NA m1 7 m4 8
method.S 4 outcome.S 4
1 <NA> NA
4 m2 7
8 <NA> NA
10 <NA> NA
12 <NA> NA
13 <NA> NA这是r的输出
这是正确的,我希望每个站点只有1行和许多列(即使站点在特定步骤中没有做任何事情)。我正在尝试为每个站点获取1行,然后结果列将在适当的列下面消失,如下所示
site S1.m1.outcome S1.m2.outcome S1.m3.outcome ................ S9.m10.outcome
a1 1 c4.5 NA 3.6所以基本上每个步骤和方法组合都有一列,我知道这是很多列,但这将使步骤之间的比较变得更容易,这是我的目标之一我这样做的主要观点是,对于给定的方法,能够使用t- test测试步骤之间的结果变化,以及诸如此类的方法差异。我想有一种更简单的方法来做测试,但我仍然是r的新手,还没有找到一个。谢谢你的建议,干杯
发布于 2013-02-28 13:12:40
如果我正确理解了您想要的输出,这里有两个选项。在下面的示例中,对于最后的步骤,我对列进行了排序,使它们在使用每个输出时都匹配,并且我只显示了结果data.frame中的前几列和最后几列,这样您就可以看到它们给出的结果是相同的。换句话说,您应该能够在实际需要时仅使用"T2“和"T3”--剩下的只是为了演示。
选项1:reshape两次
T1 <- reshape(rawdata, idvar = c("site", "method"),
timevar = "step", direction = "wide")
T2 <- reshape(T1, direction = "wide", idvar = "site", timevar = "method")
dim(T2)
# [1] 6 25
names(T2)
# [1] "site" "outcome.S1.m1" "outcome.S2.m1" "outcome.S3.m1" "outcome.S4.m1"
# [6] "outcome.S1.m2" "outcome.S2.m2" "outcome.S3.m2" "outcome.S4.m2" "outcome.S1.m6"
# [11] "outcome.S2.m6" "outcome.S3.m6" "outcome.S4.m6" "outcome.S1.m4" "outcome.S2.m4"
# [16] "outcome.S3.m4" "outcome.S4.m4" "outcome.S1.m7" "outcome.S2.m7" "outcome.S3.m7"
# [21] "outcome.S4.m7" "outcome.S1.m3" "outcome.S2.m3" "outcome.S3.m3" "outcome.S4.m3"
T2a <- T2[, order(names(T2))]
T2a[, c(1:3, 23:25)]
# outcome.S1.m1 outcome.S1.m2 outcome.S1.m3 outcome.S4.m6 outcome.S4.m7 site
# 1 5 1 <NA> <NA> <NA> a1
# 4 <NA> <NA> <NA> <NA> <NA> a2
# 8 2a c11 <NA> <NA> <NA> a3
# 10 <NA> <NA> <NA> <NA> <NA> a4
# 12 <NA> <NA> <NA> <NA> <NA> a5
# 13 <NA> <NA> <NA> <NA> <NA> a6选项2:使用"reshape2“中的dcast
library(reshape2)
T3 <- dcast(rawdata, site ~ step + method, value.var = "outcome", drop = FALSE)
dim(T3)
# [1] 6 25
names(T3)
# [1] "site" "S1_m1" "S1_m2" "S1_m3" "S1_m4" "S1_m6" "S1_m7" "S2_m1" "S2_m2" "S2_m3"
# [11] "S2_m4" "S2_m6" "S2_m7" "S3_m1" "S3_m2" "S3_m3" "S3_m4" "S3_m6" "S3_m7" "S4_m1"
# [21] "S4_m2" "S4_m3" "S4_m4" "S4_m6" "S4_m7"
T3a <- T3[, order(names(T3))]
T3a[, c(1:3, 23:25)]
# S1_m1 S1_m2 S1_m3 S4_m6 S4_m7 site
# 1 5 1 <NA> <NA> <NA> a1
# 2 <NA> <NA> <NA> <NA> <NA> a2
# 3 2a c11 <NA> <NA> <NA> a3
# 4 <NA> <NA> <NA> <NA> <NA> a4
# 5 <NA> <NA> <NA> <NA> <NA> a5
# 6 <NA> <NA> <NA> <NA> <NA> a6两者都使用以下内容作为"rawdata“的输入
rawdata <- structure(list(site = c("a1", "a1", "a1", "a2", "a2", "a2", "a2",
"a3", "a3", "a4", "a4", "a5", "a6", "a6"), step = c("S1", "S1",
"S2", "S1", "S1", "S3", "S4", "S1", "S1", "S1", "S2", "S3", "S2",
"S3"), method = c("m1", "m2", "m6", "m6", "m4", "m7", "m2", "m1",
"m2", "m4", "m2", "m3", "m1", "m4"), outcome = c("5", "1", "4",
"1a", "3", "2", "7", "2a", "c11", "2", "5", "6", "7", "8")), .Names = c("site",
"step", "method", "outcome"), row.names = c(NA, -14L), class = "data.frame")发布于 2016-09-13 20:51:37
因为我也有类似的问题。你可以把你的两个时间变量合并成一个。使用来自另一个答案的相同原始数据,您可以只使用
rawdata<-unite(rawdata, timevar, step, method)
reshape(rawdata, direction = "wide", idvar="site",timevar = "timevar")这对我理解wide -> long过程有很大帮助
https://stackoverflow.com/questions/15127255
复制相似问题