【发布时间】:2018-06-25 16:24:06
【问题描述】:
我正在处理我应该读取 csv 文件的作业,然后将其发送到要转换为类对象的函数。我设法读取了 csv 文件并将其转换为对象:
make_LD <- function(x){
structure(list(id = c(x$id), visit = c(x$visit),
room = c(x$room), value = c(x$value), timepoint = c(x$timepoint)), class = "LongitudinalData")
}
输入 CSV 文件的可重现版本是:
data <- structure(list(id = c(14L, 14L, 14L, 14L, 14L, 14L, 14L, 14L,
14L, 14L, 14L, 14L, 14L, 14L, 14L, 14L, 14L, 14L, 14L, 14L),
visit = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), room = c("bedroom", "bedroom",
"bedroom", "bedroom", "bedroom", "bedroom", "bedroom", "bedroom",
"bedroom", "bedroom", "bedroom", "bedroom", "bedroom", "bedroom",
"bedroom", "bedroom", "bedroom", "bedroom", "bedroom", "bedroom"
), value = c(6, 6, 2.75, 2.75, 2.75, 2.75, 6, 6, 2.75, 2.75,
2.75, 2.75, 2.75, 2.75, 2.75, 2.75, 2.75, 2.75, 2.75, 2.75
), timepoint = 53:72), .Names = c("id", "visit", "room",
"value", "timepoint"), class = "data.frame", row.names = c(NA,
-20L))
我是如何运行这段代码的:
## Read in the data
library(readr)
library(magrittr)
library(dplyr)
source("oop_code_2.R")
## Load any other packages that you may need to execute your code
data <- read_csv("data/MIE.csv")
x <- make_LD(data)
out <- subject(x, 14)
完成此操作后,我使用对象变量并将其发送到通用函数:
subject <- function(x, id) UseMethod("subject")
subject.LongitudinalData <- function(x, subj){
subj_exist <- x %>%
group_by_(x$id) %>%
filter(x$id == subj)
return(subj_exist)
}
当我运行代码时,它会产生错误:
Error in UseMethod("group_by_") :
no applicable method for 'group_by_' applied to an object of class "LongitudinalData"
我注意到读入的 csv 文件的格式是按列组织的,而我将其发送为对象后的数据格式已更改为字段。
问题是,我做错了什么? 谢谢!
编辑/添加:
当我对来自 csv 的数据运行此代码时,它可以正常工作,如下所示。如果这有帮助。
> datatest1 <- data %>%
+ group_by(id, visit, room) %>%
+ select(id, visit, room , value) %>%
+ filter(id == 14) %>%
+ summarise(valmean = mean(value))
> print(datatest1)
# A tibble: 6 x 4
# Groups: id, visit [?]
id visit room valmean
<int> <int> <chr> <dbl>
1 14 0 bedroom 4.786592
2 14 0 living room 2.750000
3 14 1 bedroom 3.401442
4 14 1 family room 8.426549
5 14 2 bedroom 18.583635
6 14 2 living room 22.550694
在 LongitudinalData 对象上完成后,会引发错误:
> datatest2 <- x %>%
+ group_by(id, visit, room) %>%
+ select(id, visit, room , value) %>%
+ filter(id == 14) %>%
+ summarise(valmean = mean(values))
Error in UseMethod("group_by_") :
no applicable method for 'group_by_' applied to an object of class "LongitudinalData"
这也可能来自数据的格式化方式。下面是数据在转换为 LongitudinalData 对象之前和之后的样子的示例。
> head(data)
# A tibble: 6 x 5
id visit room value timepoint
<int> <int> <chr> <dbl> <int>
1 14 0 bedroom 6.00 53
2 14 0 bedroom 6.00 54
3 14 0 bedroom 2.75 55
4 14 0 bedroom 2.75 56
5 14 0 bedroom 2.75 57
6 14 0 bedroom 2.75 58
> head(x)
$id
[1] 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
[40] 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
[79] 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14 14
$visit
[1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[60] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[119] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
这是数据的链接:data
【问题讨论】:
-
你到底想用
group_by_(x$id)做什么?目前尚不清楚您要做什么,因此不清楚您做错了什么。您可能不想要该函数的下划线版本,并且您可能希望省略x$部分。 -
我的目标是将所有具有相同 id 的条目分组,并最终获得它们的值的平均值。
-
如果您提供带有示例输入和所需输出的reproducible example,会更容易提供帮助。
-
添加了一个例子,如果有帮助的话。
-
请添加一个可重现的示例,您可以在其中创建数据框或提供指向我们可以自己下载的文件的链接,@afterafx