编写一个传递数据帧并返回列表的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中效率最低的操作之一。永远不要使用它。