R函数内的局部变量不起作用

时间:2018-01-26 06:30:18

标签: r function local-variables

我需要你的帮助。我的数据框如下所示

   id      home_1     home_2      home_3
1   1 -0.07288651 -1.0946734  0.06310788
2   2  0.27480575 -0.5939264 -0.10267407
3   3 -1.29267610 -1.0765848 -0.96190129
4   4 -0.53468273  0.5315489 -1.36055340
...

我想创建3个数据帧; df1 df2 df3

  • df1 会有一个已排序列'home_1'的表
  • df2 会有一个已排序列'home_2'的表
  • df3 会有一个已排序列'home_3'的表

请找到以下代码

dummy <- data.frame(id = 1:10,home_1 = rnorm(10),home_2 = rnorm(10),home_3 = rnorm(10))

f <- function(df,param1, param2) {
    c <- paste0(param1, "_", param2);
    print(paste0("Let's sort column ", c))
    df %>% arrange(c) %>% print()  #sort dataframe by column 'home_1/2/3'
}

for (i in 1:3) {
    print(paste0("Index : ",i))
    table <- paste0("df",i)     
    table <- f(dummy,"home",i) # create dataframe with name df1/2/3
}

问题1 然后我运行我的代码,该函数无法检测各自的列。我的功能中的错误

Error in grouped_df_impl(data, unname(vars), drop) : 
Column `c` is unknown 

本地变量 c 确实存在,但 group_by 功能无法检测 c

  

有人知道如何通过group_by函数检测列'c'吗?

问题2 与我的for循环相同的问题。我想创建一个动态的数据框名称。

  

但是,以下函数 table&lt; -f(dummy,“home”,i),创建了一个名为'table'的数据框,而不是 'DF1'

有人能给我一些关于如何解决这些问题的提示吗? 提前谢谢。

2 个答案:

答案 0 :(得分:1)

您可以遍历列列表,然后按每列排序

cols <- structure(setdiff(names(dat), "id"), names=setdiff(names(dat), "id"))
lapply(cols, function(x) dat[order(dat[,x]),])

数据:

dat <- read.table(text="id      home_1     home_2      home_3
1 -0.07288651 -1.0946734  0.06310788
2  0.27480575 -0.5939264 -0.10267407
3 -1.29267610 -1.0765848 -0.96190129
4 -0.53468273  0.5315489 -1.36055340", header=TRUE)

答案 1 :(得分:1)

我会使用tidyverse的排列功能,这非常简单。

我还使用base-r中的“assign”为一个名字存储在字符串中的vetor赋值。

library(tidyverse)
for(i in 1:(ncol(dummy)-1)){
  #define the name for the new data
  new = paste0("df",i) 

  #define the same of the column to sort on
  col = paste("home",i,sep="_") 

  # based on the data dummy, arrange the rows according to "col"
  # we need to use "get" because arrange expects bare (unquoted) column names
  tmp = dummy %>% arrange(get(col))
  assign(new, tmp)
 }