编写一个传递数据帧并返回列表的R函数
我想写一个函数,将数据框作为输入,对于数据框中的每个数值变量,函数以列表的形式返回给用户变量的平均值、中值和四分位范围 数据框如下:编写一个传递数据帧并返回列表的R函数,r,list,dataframe,R,List,Dataframe,我想写一个函数,将数据框作为输入,对于数据框中的每个数值变量,函数以列表的形式返回给用户变量的平均值、中值和四分位范围 数据框如下: 'data.frame': 271 obs. of 6 variables: $ sample.id: int 1 2 4 5 6 7 8 9 12 13 ... $ zip : int 48504 48507 48504 48507 48505 48507 48507 48503 48507 48505 ... $ ward :
'data.frame': 271 obs. of 6 variables:
$ sample.id: int 1 2 4 5 6 7 8 9 12 13 ...
$ zip : int 48504 48507 48504 48507 48505 48507 48507 48503 48507 48505 ...
$ ward : int 6 9 1 8 3 9 9 5 9 3 ...
$ Pb1 : num 0.344 8.133 1.111 8.007 1.951 ...
$ Pb2 : num 0.226 10.77 0.11 7.446 0.048 ...
$ Pb3 : num 0.145 2.761 0.123 3.384 0.035 ...
输出应如下所示:
$Pb1
Mean Median IQR
10.76687 3.56400 7.75100
$Pb2
Mean Median IQR
10.43467 1.40000 4.50100
$Pb3
Mean Median IQR
3.701434 0.839000 2.429500
这是我的密码:
df.numeric.summary <- function(data) {
for (i in 1:ncol(data)) {
if (is.numeric(data[[i]]) == TRUE) {
variable_mean <- mean(data[[i]])
variable_median <- median(data[[i]])
variable_IQR <- IQR(data[[i]])
variable_data <- data.frame(Mean = variable_mean, Median = variable_median, IQR = variable_IQR)
}
}
return(variable_data)
}
我的代码只产生了Pb3,我想我不能使用for语句,但我怎么能得到三个变量的值呢?另外,如何将结果返回到列表中?有各种程度的简化/折叠,但是:
df.numeric.val <- function(col) {
return(c(mean=mean(col),median=median(col),IQR=IQR(col)))
}
df.numeric.summary <- function(data) {
numcols <- sapply(data,is.numeric)
vals <- lapply(data[numcols],df.numeric.val)
return(vals)
}
df.numeric.summary(mtcars)
您可以在不同程度上简化/折叠它,但是:
df.numeric.val <- function(col) {
return(c(mean=mean(col),median=median(col),IQR=IQR(col)))
}
df.numeric.summary <- function(data) {
numcols <- sapply(data,is.numeric)
vals <- lapply(data[numcols],df.numeric.val)
return(vals)
}
df.numeric.summary(mtcars)
虽然在R中有更好的方法来做这类事情,但我建议您看看如何使用Lappy,正如至少在另一个答案和一条评论中所建议的那样,我将重点介绍for-loop方法 您的错误是在循环的每次传递中从头开始重新创建变量_数据。就好像你已经走了:
for (i in 1:3) {
x = i
}
return(x) # <-- This will return a 3
至于将数据帧转换为列表,这是一个单独的问题,已经得到了回答。最流行的答案是:
xy.list <- split(xy.df, seq(nrow(xy.df)))
其中xy.df是您的数据帧的名称。虽然在R中有更好的方法来做这类事情,但我建议您看看如何使用Lappy,正如至少在一个其他答案和一条注释中所建议的那样,我将重点介绍for-loop方法 您的错误是在循环的每次传递中从头开始重新创建变量_数据。就好像你已经走了:
for (i in 1:3) {
x = i
}
return(x) # <-- This will return a 3
至于将数据帧转换为列表,这是一个单独的问题,已经得到了回答。最流行的答案是:
xy.list <- split(xy.df, seq(nrow(xy.df)))
其中xy.df是您的数据帧的名称。我认为您应该重新考虑您在此处选择的公认答案。在for循环中增长数据帧是整个R中效率最低的操作之一。永远不应该使用它。我认为您应该重新考虑您在这里选择的公认答案。在for循环中增长数据帧是整个R中效率最低的操作之一。永远不要使用它。