【问题标题】:in R function, assign data frame object as a name? loop through function在 R 函数中,将数据框对象指定为名称?循环函数
【发布时间】:2017-10-08 13:58:35
【问题描述】:

我的问题有两个。首先,给定这三个数据框:

df1 <- data.frame(k1 = runif(6, min=0, max=100), 
             k2 = runif(6, min=0, max=100), 
             k3 = runif(6, min=0, max=100), 
             k4 = runif(6, min=0, max=100))
df2 <- data.frame(k1 = runif(6, min=0, max=100), 
              k2 = runif(6, min=0, max=100), 
              k3 = runif(6, min=0, max=100), 
              k4 = runif(6, min=0, max=100))
df3 <- data.frame(k1 = runif(6, min=0, max=100), 
              k2 = runif(6, min=0, max=100), 
              k3 = runif(6, min=0, max=100), 
              k4 = runif(6, min=0, max=100))

我想使用这个函数重新格式化和重命名每个数据框的一部分:

samplelist<-c("k2", "k4")

draft_fxn<-function(x, obj_name){
  x.selected<-x[,c(samplelist)] #select columns of choice
  colnames(x.selected)[1:2]<-paste(obj_name, colnames(x.selected), sep="_") #rename columns so they include original data frame name
  return(x.selected)
}

#Example run and output:
df2_final<-draft_fxn(df2, "df2")
#output from:
head(df2_final[1:2],)
>     df2_k2   df2_k4
>1  5.240274 53.03423
>2  5.042926 34.78974

第一个问题:我怎样才能改变我的功能,这样我就不必输入'df2,“df2”'。在我的 draft_fxn 代码中,我想用输入数据框的名称替换“obj_name”。在我的示例中,它是“df2”。

第二个问题:如何循环遍历所有数据帧?也许,类似于这个 for 循环? 对象

for (file in objs){
  out<-draft_fxn(file); return(out)
} #this doesn't work though. 

【问题讨论】:

标签: r function loops dataframe


【解决方案1】:

回答您的第一个问题:您可以使用deparse(substitute(x)) 获取对象的名称x。所以要从你的函数中消除参数obj_name,你可以使用

draft_fxn <- function(x){
    obj_name <- deparse(substitute(x))
    x.selected<-x[,c(samplelist)]
    colnames(x.selected)[1:2]<-paste(obj_name, colnames(x.selected), sep="_") #rename columns so they include original data frame name
    return(x.selected)
}  

关于你的第二个问题,如果你想对多个数据帧执行这样的操作,你通常会把它们放在一个列表中,然后lapply这个函数。但是,在这种情况下,它不起作用,因为如果将数据框放入列表中,对象名称会发生​​变化,即deparse(substitute(x)) 返回X[[i]]_,而不是单个数据框的名称。如果您想在循环中执行此操作,我会建议一种不同的方法,您可以传递数据帧名称的向量:

## Names of the relevant data frames:
objNames <- c("df1", "df2", "df3")
## Function to rename the specified columns:
renameFun <- function(xString){
    x <- get(xString)[,c(samplelist)]
    colnames(x) <- paste(xString, samplelist, sep = "_")
    x   
}

## Apply function to all data frames specifed by objNames:
lapply(objNames, renameFun) 
# [[1]]
#      df1_k2    df1_k4
# 1 54.232123  2.178375
# 2 16.816784 23.586760
# 3  6.612874 16.509340
# 4 92.399588 71.133637
# 5 22.917838  8.127079
# 6 43.563411 21.118758
# 
# ...

【讨论】:

    【解决方案2】:

    所以您的函数没有很好地指定,因为您在函数外部定义 samplelist 然后在内部调用它。这样做的问题是,如果您没有定义 samplelist,该函数将返回错误,即它不是独立的。

    这里有一个替代方案:

      draft_fxn<-function(x, cols =...){
      x.selected<-data.frame(x[, cols]) #select columns of choice
      colnames(x.selected)<-paste(deparse(substitute(x)), colnames(x.selected), sep="_") #rename columns so they include original data frame name
      return(x.selected)
    }
    

    请注意,cols 参数可以变化(只要它是正数并且不大于数据框中的列数)。

    这会返回:

    > df2_final<- draft_fxn(df2, cols = c("k2", "k4"))
    > head(df2_final)[1:2,]
        df2_k2    df2_k4
    1 21.62533  2.256182
    2 64.83556 67.705705
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多