【问题标题】:How to improve this function to accept multiple arguments如何改进此函数以接受多个参数
【发布时间】:2020-06-09 11:39:22
【问题描述】:

我有一个函数可以根据其索引更改列的名称。 它仅限于 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)

对此有什么想法吗?

【问题讨论】:

标签: r


【解决方案1】:

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

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


【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2018-08-26
      • 2020-04-22
      • 1970-01-01
      • 2023-01-12
      • 1970-01-01
      • 2012-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多