具有写入 3 个单独列 R 或 dplyr/reshape 解决方案的函数的 for 循环?
for loop with function that writes to 3 separate columns R or dplyr/reshape solution?
我完全是 for 循环的初学者,所以如果这个问题已经有了明确的答案,我深表歉意,但我找不到任何我理解如何应用于这个特定问题的东西。最后我也开始尝试 dplyr 实现,但也无法弄清楚。
这是我的问题:有一个函数可以从向量中导出 3 个值。我想将这 3 个值写入与新列相同的 df。该函数是 timefit
,来自 R 中的 retimes
库。
如果我运行就全df:
a1 <- timefit(data$RT)
a1:
mu: 480.3346
sigma: 77.8531
tau: 376.7426
如果我将值放入 df
df <- data.frame(a1@par)
:
a1.par
mu 480.33462
sigma 77.85305
tau 376.74257
我想 运行 基于另一个变量 "location" (一个有两个级别的因素)为每个子 ID 单独设置它。所以我最终得到了类似
的东西
subID location mu sigma tau
1 0 500 50 400
1 0 500 50 400
1 1 376 50 410
1 1 376 50 410
2 0 400 60 400
2 0 400 60 400
2 1 410 60 410
2 1 410 60 410
我开始使用
for (subID in data) {
timefit(data$RT)
}
但我知道这实际上不会做我需要它做的事情。使用@par 将值从timefit 模型中提取为长格式,因此我需要指定函数timefit 以写入3 个单独的列headers?有什么建议么?
此外,我考虑过使用 ddply,但最后一行让我感到困惑,因为格式很长,但我需要它很宽。我搞砸了一点 reshape,但我无法弄清楚它
data <- data %>%
group_by(subID, location) %>%
mutate(timefit_out = timefit(RT))
感谢您的帮助!
如果您正在寻找 dplyr
解决方案,您可能正在寻找的是 do
。它允许 returns of data.frames,尽管可能需要一些操作。具体来说,它旨在处理组,而不是(必须)行。因此,如果您希望 return 包含一些原始信息(并且取决于您的函数的结构),则必须设置组。
为此,我正在生成一个简单的数据集:
myData <-
data.frame(
RT = 1:4
)
您还需要构建一个函数,return 将您想要的值作为 data.frame。为了您的使用,您可能会在函数中计算 timefit
的结果,然后将每个值作为一列提取到 return:
myFunc <- function(x){
data.frame(a= x + 1, b = x + 2, c = x + 3)
}
然后,按要分隔的列分组(和 return),然后调用 do
:
myData %>%
group_by(RT) %>%
do((myFunc(.$RT)))
在这种情况下,return是这样的:
RT a b c
1 1 2 3 4
2 2 3 4 5
3 3 4 5 6
4 4 5 6 7
您可以在此处使用 summarise
而不是 mutate
来生成一个 列表列 ,其中每个 (subID, location)
包含一个 data.frame
]的timefit
。这些数据帧将 timefit
结果中的 mu
、sigma
和 tau
编码为列。然后,使用 unnest
取消嵌套此列表列以生成您想要的结果。
library(retimes)
library(dplyr)
library(tidyr)
result <- data %>% group_by(subID, location) %>%
summarise(timefit_out = list(data.frame(t(attr(timefit(RT),"par"))))) %>%
unnest()
请注意,我们从 timefit
class 中提取 "par"
属性,然后将其与 t
转置以形成 mu
、sigma
, 和 tau
.
在这里,我们假设您的输入 data
是一个包含列 subID
、location
和输入的反应时间数字列 RT
的数据框至 timefit
。此类数据集的模拟示例如下:
data <- structure(list(subID = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L),
location = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L),
RT = c(0.341764254728332, 0.775535081513226, 0.281827432336286,
0.23970171622932, 0.00226009078323841, 0.385179498931393,
0.645917195128277, 0.812101020244882, 0.183301427634433,
0.981765420176089, 0.656369511503726, 0.824469136772677,
0.923240559641272, 0.598261737963185, 0.309975759591907,
0.778991278028116, 0.757012664806098, 0.869985132943839,
0.439378245733678, 0.8420404586941, 0.643788777757436, 0.381316626211628,
0.123881611274555, 0.540528740268201, 0.661961955949664,
0.0592848095111549, 0.904047027230263, 0.190083365887403,
0.963809312786907, 0.0925120878964663, 0.117538752267137,
0.451085010776296, 0.703220259631053, 0.378451474476606,
0.305718191433698, 0.70383172808215, 0.699415655340999, 0.740436099236831,
0.429179352009669, 0.205358384409919)), .Names = c("subID",
"location", "RT"), row.names = c(NA, 40L), class = "data.frame")
## subID location RT
##1 1 0 0.341764255
##2 1 0 0.775535082
##3 1 0 0.281827432
##4 1 0 0.239701716
##5 1 0 0.002260091
##6 1 0 0.385179499
##7 1 0 0.645917195
##8 1 0 0.812101020
##9 1 0 0.183301428
##10 1 0 0.981765420
##11 1 1 0.656369512
##12 1 1 0.824469137
##13 1 1 0.923240560
##14 1 1 0.598261738
##15 1 1 0.309975760
##16 1 1 0.778991278
##17 1 1 0.757012665
##18 1 1 0.869985133
##19 1 1 0.439378246
##20 1 1 0.842040459
##21 2 0 0.643788778
##22 2 0 0.381316626
##23 2 0 0.123881611
##24 2 0 0.540528740
##25 2 0 0.661961956
##26 2 0 0.059284810
##27 2 0 0.904047027
##28 2 0 0.190083366
##29 2 0 0.963809313
##30 2 0 0.092512088
##31 2 1 0.117538752
##32 2 1 0.451085011
##33 2 1 0.703220260
##34 2 1 0.378451474
##35 2 1 0.305718191
##36 2 1 0.703831728
##37 2 1 0.699415655
##38 2 1 0.740436099
##39 2 1 0.429179352
##40 2 1 0.205358384
此示例中 RT
的值是使用 runif
生成的,因此它们介于 0
和 1
之间。你们的价值观有很大的不同,但这在这里应该无关紧要。
使用这些数据,我们得到:
print(result)
##Source: local data frame [4 x 5]
##Groups: subID [2]
##
## subID location mu sigma tau
## <int> <int> <dbl> <dbl> <dbl>
##1 1 0 0.5275058 0.2553621 0.007086207
##2 1 1 0.2609386 0.1583494 0.085449559
##3 2 0 0.5205647 0.1994942 0.027329115
##4 2 1 0.4632886 0.2881343 0.008026460
我完全是 for 循环的初学者,所以如果这个问题已经有了明确的答案,我深表歉意,但我找不到任何我理解如何应用于这个特定问题的东西。最后我也开始尝试 dplyr 实现,但也无法弄清楚。
这是我的问题:有一个函数可以从向量中导出 3 个值。我想将这 3 个值写入与新列相同的 df。该函数是 timefit
,来自 R 中的 retimes
库。
如果我运行就全df:
a1 <- timefit(data$RT)
a1:
mu: 480.3346
sigma: 77.8531
tau: 376.7426
如果我将值放入 df
df <- data.frame(a1@par)
:
a1.par
mu 480.33462
sigma 77.85305
tau 376.74257
我想 运行 基于另一个变量 "location" (一个有两个级别的因素)为每个子 ID 单独设置它。所以我最终得到了类似
的东西subID location mu sigma tau
1 0 500 50 400
1 0 500 50 400
1 1 376 50 410
1 1 376 50 410
2 0 400 60 400
2 0 400 60 400
2 1 410 60 410
2 1 410 60 410
我开始使用
for (subID in data) {
timefit(data$RT)
}
但我知道这实际上不会做我需要它做的事情。使用@par 将值从timefit 模型中提取为长格式,因此我需要指定函数timefit 以写入3 个单独的列headers?有什么建议么?
此外,我考虑过使用 ddply,但最后一行让我感到困惑,因为格式很长,但我需要它很宽。我搞砸了一点 reshape,但我无法弄清楚它
data <- data %>%
group_by(subID, location) %>%
mutate(timefit_out = timefit(RT))
感谢您的帮助!
如果您正在寻找 dplyr
解决方案,您可能正在寻找的是 do
。它允许 returns of data.frames,尽管可能需要一些操作。具体来说,它旨在处理组,而不是(必须)行。因此,如果您希望 return 包含一些原始信息(并且取决于您的函数的结构),则必须设置组。
为此,我正在生成一个简单的数据集:
myData <-
data.frame(
RT = 1:4
)
您还需要构建一个函数,return 将您想要的值作为 data.frame。为了您的使用,您可能会在函数中计算 timefit
的结果,然后将每个值作为一列提取到 return:
myFunc <- function(x){
data.frame(a= x + 1, b = x + 2, c = x + 3)
}
然后,按要分隔的列分组(和 return),然后调用 do
:
myData %>%
group_by(RT) %>%
do((myFunc(.$RT)))
在这种情况下,return是这样的:
RT a b c
1 1 2 3 4
2 2 3 4 5
3 3 4 5 6
4 4 5 6 7
您可以在此处使用 summarise
而不是 mutate
来生成一个 列表列 ,其中每个 (subID, location)
包含一个 data.frame
]的timefit
。这些数据帧将 timefit
结果中的 mu
、sigma
和 tau
编码为列。然后,使用 unnest
取消嵌套此列表列以生成您想要的结果。
library(retimes)
library(dplyr)
library(tidyr)
result <- data %>% group_by(subID, location) %>%
summarise(timefit_out = list(data.frame(t(attr(timefit(RT),"par"))))) %>%
unnest()
请注意,我们从 timefit
class 中提取 "par"
属性,然后将其与 t
转置以形成 mu
、sigma
, 和 tau
.
在这里,我们假设您的输入 data
是一个包含列 subID
、location
和输入的反应时间数字列 RT
的数据框至 timefit
。此类数据集的模拟示例如下:
data <- structure(list(subID = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L),
location = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L),
RT = c(0.341764254728332, 0.775535081513226, 0.281827432336286,
0.23970171622932, 0.00226009078323841, 0.385179498931393,
0.645917195128277, 0.812101020244882, 0.183301427634433,
0.981765420176089, 0.656369511503726, 0.824469136772677,
0.923240559641272, 0.598261737963185, 0.309975759591907,
0.778991278028116, 0.757012664806098, 0.869985132943839,
0.439378245733678, 0.8420404586941, 0.643788777757436, 0.381316626211628,
0.123881611274555, 0.540528740268201, 0.661961955949664,
0.0592848095111549, 0.904047027230263, 0.190083365887403,
0.963809312786907, 0.0925120878964663, 0.117538752267137,
0.451085010776296, 0.703220259631053, 0.378451474476606,
0.305718191433698, 0.70383172808215, 0.699415655340999, 0.740436099236831,
0.429179352009669, 0.205358384409919)), .Names = c("subID",
"location", "RT"), row.names = c(NA, 40L), class = "data.frame")
## subID location RT
##1 1 0 0.341764255
##2 1 0 0.775535082
##3 1 0 0.281827432
##4 1 0 0.239701716
##5 1 0 0.002260091
##6 1 0 0.385179499
##7 1 0 0.645917195
##8 1 0 0.812101020
##9 1 0 0.183301428
##10 1 0 0.981765420
##11 1 1 0.656369512
##12 1 1 0.824469137
##13 1 1 0.923240560
##14 1 1 0.598261738
##15 1 1 0.309975760
##16 1 1 0.778991278
##17 1 1 0.757012665
##18 1 1 0.869985133
##19 1 1 0.439378246
##20 1 1 0.842040459
##21 2 0 0.643788778
##22 2 0 0.381316626
##23 2 0 0.123881611
##24 2 0 0.540528740
##25 2 0 0.661961956
##26 2 0 0.059284810
##27 2 0 0.904047027
##28 2 0 0.190083366
##29 2 0 0.963809313
##30 2 0 0.092512088
##31 2 1 0.117538752
##32 2 1 0.451085011
##33 2 1 0.703220260
##34 2 1 0.378451474
##35 2 1 0.305718191
##36 2 1 0.703831728
##37 2 1 0.699415655
##38 2 1 0.740436099
##39 2 1 0.429179352
##40 2 1 0.205358384
此示例中 RT
的值是使用 runif
生成的,因此它们介于 0
和 1
之间。你们的价值观有很大的不同,但这在这里应该无关紧要。
使用这些数据,我们得到:
print(result)
##Source: local data frame [4 x 5]
##Groups: subID [2]
##
## subID location mu sigma tau
## <int> <int> <dbl> <dbl> <dbl>
##1 1 0 0.5275058 0.2553621 0.007086207
##2 1 1 0.2609386 0.1583494 0.085449559
##3 2 0 0.5205647 0.1994942 0.027329115
##4 2 1 0.4632886 0.2881343 0.008026460