【问题标题】:make it a function让它成为一个函数
【发布时间】:2012-05-21 17:32:24
【问题描述】:

在 SO 的帮助下,我现在可以重命名数据框中的所有变量,但选定的子集除外。我目前正在使用this method,请看一击(感谢flodel)。

我想编写一个函数,我可以在其中定义 1)我的数据,2)变量向量和 3)我想在函数中未选择的变量中添加什么前缀(请参阅下面的尝试)。我错误地认为这很容易,但我很难让该功能正常工作。

这是我编写函数的尝试,这显然是行不通的。另外,如果有人推荐一个网站或一些文本,我可以阅读以更好地理解如何编写函数。

baRadd <- function(df, vector, suffix){names(df) <- 
                   ifelse(names(df) %in% vector,names(df), 
                   paste(suffix, names(df), sep = ".")) }

data(mtcars)
temp.mtcars <- mtcars
baRadd(temp.mtcars, c("mpg", "cyl", "disp"), "baR")  

初始函数形式flodel

data(mtcars)
# head(mtcars)

temp.mtcars <- mtcars
names(temp.mtcars) <- ifelse(names(mtcars) %in% c("mpg", "cyl", "disp"),
                         names(mtcars),
                         paste("baR", names(mtcars), sep = "."))
str(temp.mtcars)
'data.frame': 32 obs. of  11 variables:
 $ mpg     : num  21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
 $ cyl     : num  6 6 4 6 8 6 8 4 4 6 ...
 $ disp    : num  160 160 108 258 360 ...
 $ baR.hp  : num  110 110 93 110 175 105 245 62 95 123 ...
 $ baR.drat: num  3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
 $ baR.wt  : num  2.62 2.88 2.32 3.21 3.44 ...
 $ baR.qsec: num  16.5 17 18.6 19.4 17 ...
 $ baR.vs  : num  0 0 1 1 0 1 0 1 1 1 ...
 $ baR.am  : num  1 1 1 0 0 0 0 0 0 0 ...
 $ baR.gear: num  4 4 4 3 3 3 3 4 4 4 ...
 $ baR.carb: num  4 4 1 1 2 1 4 2 2 4 ...

【问题讨论】:

    标签: r function


    【解决方案1】:

    主要问题是您的函数没有返回任何值。它只是修改了data.frame df,(这是评估环境的本地)然后退出。

    要让它返回修改后的对象,请执行以下操作:

    data(mtcars)
    mtcars1 <- mtcars
    
    baRadd <- function(df, vector, suffix){ 
                       names(df) <- ifelse(names(df) %in% vector,names(df), 
                                          paste(suffix, names(df), sep = ".")) 
                       return(df)}
    
    mtcars1 <- baRadd(mtcars1, c("mpg", "cyl", "disp"), "baR") 
    

    一个更好的解决方案(在我看来)是编写一个函数来创建一个修改后的名称向量,然后您可以将其分配给现有的 data.frame。

    mtcars2 <- mtcars
    baRadd2 <- function(df, vector, suffix){ 
                        newnames <- ifelse(names(df) %in% vector,names(df), 
                                           paste(suffix, names(df), sep = ".")) 
                        return(newnames)}
    
    names(mtcars2) <- baRadd2(mtcars2, c("mpg", "cyl", "disp"), "baR") 
    

    【讨论】:

    • 谢谢,我猜我从来没弄明白return()。谢谢!
    • 当然。您实际上并不需要return()。如果缺少,该函数将返回其最后一行的值。因此,在上面的第二个示例中,您也可以: (a) 将最后一行更改为 newnames;或 (b) 删除最后一行,以及对newnames 的赋值(即此位:newnames &lt;- )。我只是倾向于将return() 包含在内,作为关于返回内容的明确视觉提示。干杯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多