for循环的函数写入3个单独的列R或dplyr / reshape解决方案?

时间:2016-10-10 13:40:37

标签: r dplyr reshape reshape2

我是for循环的初学者,所以如果对这个问题有一个明确的答案,我很抱歉,但我无法找到任何我理解如何应用于这个特定问题。我也开始在最后尝试dplyr实现,但也无法解决这个问题。

这是我的问题:有一个函数可以从向量中导出3个值。我想将这3个值写入与新列相同的df。该函数来自R中timefit库的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”(具有两个级别的因子)为每个subID单独运行它。所以我最终得到像

这样的东西
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模型中提取值为long格式,因此我需要指定函数timefit来写入3个单独的列标题?有什么建议?

另外,我考虑过使用ddply,但是最后一行是绊倒了我,因为格式很长但是我需要宽一点。我搞砸了一下,但我很难搞清楚

data <- data %>% 
  group_by(subID, location) %>%
  mutate(timefit_out = timefit(RT))

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您可以在此处使用summarise代替mutate来生成包含data.frame (subID, location)timefit列表列 1}}。这些数据框将mu的结果sigmatautimefit编码为列。然后,使用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()

请注意,我们从"par"类中提取timefit属性,然后将其与t转置,以形成musigma和{的列{1}}。

在此,我们假设您的输入tau是一个数据框,其中包含datasubID列,以及输入{的反应时间location的数字列{1}}。这种数据集的模拟示例由:

给出
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 生成的,因此它们介于RTrunif之间。你的价值观差异很大,但这不重要。

使用这些数据,我们得到:

0

答案 1 :(得分:0)

如果您正在寻找dplyr解决方案,那么您可能正在寻找的是do。它允许返回data.frames,但可能需要一些操作。具体来说,它旨在处理组,而不是(必然)行。因此,如果您希望它返回一些原始信息(并且取决于您的函数结构),则必须设置组。

为此,我正在生成一个简单的数据集:

myData <-
  data.frame(
    RT = 1:4
  )

您还需要构造一个函数,将所需的值作为data.frame返回。为了您的使用,您可能会计算函数中timefit的结果,然后将每个值作为一列提取以返回:

myFunc <- function(x){
  data.frame(a= x + 1, b = x + 2, c = x + 3)
}

然后,按要分隔的列(并返回)进行分组,然后调用do

myData %>%
  group_by(RT) %>%
  do((myFunc(.$RT)))

在这种情况下,返回以下内容:

     RT     a     b     c
1     1     2     3     4
2     2     3     4     5
3     3     4     5     6
4     4     5     6     7