如何改进此函数以接受多个参数

时间:2020-06-09 11:39:22

标签: r

我有一个功能,可以根据其索引更改列的名称。 它仅限于2列。最好更改此功能以接受多个输入。 但是我不确定使用哪种数据结构来执行此操作。 谁能指出我正确的方向?

这是示例数据集和函数:

id <- c(500,600,700,800)
test1 <- c(1,4,5,6)
test2 <- c(6,4,3,6)
test3 <- c(4,3,4,6)
test4 <- c(3,5,6,6)
test <- data.frame(id,test1,test2,test3,test4)

func1 <- function (df, col_name1, col_range1, col_name2, col_range2) {
  for (i in 1:length(names(df))) {
    if (i %in% col_range1) {
      names(df)[i] <- paste(col_name1,names(df)[i], sep = "_")
    }
    else if (i %in% col_range2) {
      names(df)[i] <- paste(col_name2,names(df)[i], sep = "_")
    }
  }
  return(df)
}

该功能可以像这样使用:

test <- func1(test, "MH", 2:3, "MP", 4:5)

最好更改功能,使其可以接受如下输入:

test <- func1(test, "MH", 2, "ML", 3, "MP", 4:5)

对此有何想法?

2 个答案:

答案 0 :(得分:2)

我不喜欢建议的设计。我将使用一个参数作为前缀,使用一个参数作为索引,即两个列表:

func1 <- function (df, col_names, col_ranges) {
  mapply(function(n, i) names(df)[i] <<- paste(n, names(df)[i], sep = "_"), 
         col_names, col_ranges)
  return(df)
}

func1(test, list("MH", "ML", "MP"), list(2, 3, 4:5))
#   id MH_test1 ML_test2 MP_test3 MP_test4
#1 500        1        6        4        3
#2 600        4        4        3        5
#3 700        5        3        4        6
#4 800        6        6        6        6

答案 1 :(得分:2)

您还可以将命名列表作为第二个参数,其中list元素的名称是要添加的列前缀,而list元素的值是列索引的数字向量。

func1 <- function (df, col_names) {
  for (n in seq_along(col_names)) {
    name <- names(col_names)[n]
    cols <- col_names[n]

    for (i in cols) {
      colnames(df)[i] <- paste(name,colnames(df)[i], sep = "_")
    }

  }

  return(df)
}

> func1(test, col_names = list(MH = 2, ML = 3, MP = 4:5))
   id MH_test1 ML_test2 MP_test3 MP_test4
1 500        1        6        4        3
2 600        4        4        3        5
3 700        5        3        4        6
4 800        6        6        6        6


相关问题