【问题标题】:write r function to modify value in data frame编写r函数来修改数据框中的值
【发布时间】:2020-12-17 20:26:47
【问题描述】:

我有一组变量,比如 Var1、Var2 到 Varn。它们都取三个可能的值 0、1 和 2。我想将所有 2 替换为 1

like so
df$Var1[df$Var1 >= 1] <- 1

这可以完成工作。但是当我尝试编写一个函数来做到这一点时

MakeBinary <- function(varName dfName){dfName$varName[dfName$varNAme > = 1] <- 1}

并像这样使用这个函数:

MakeBinary(Var2, df)

我收到一条错误消息:$&lt;-.data.frame(*tmp*, "varName", value = numeric(0)) 中的错误: 替换有0行,数据有512。

我只是想知道为什么我会收到这条消息。谢谢。我的样本量是 512。

【问题讨论】:

    标签: r function dataframe


    【解决方案1】:

    如果我们将列名作为字符串传递,则使用 [[ 而不是 $return 数据集

    MakeBinary <- function(varName, dfName){
         dfName[[varName]][dfName[[varName]] >= 1] <- 1
       dfName
       }
    
    MakeBinary("Var2", df)
    

    mtcars 示例

    MakeBinary("carb", head(mtcars))
    #                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
    #Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    1
    #Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    1
    #Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
    #Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
    #Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    1
    #Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
    

    变量名的不带引号的参数也可以传递,但需要转换为字符串

    MakeBinary <- function(varName, dfName){
         varName <- deparse(substitute(varName))
         dfName[[varName]][dfName[[varName]] >= 1] <- 1
       dfName
       }
    
    MakeBinary(Var2, df)
    

    使用mtcars 的可重现示例

    MakeBinary(carb, head(mtcars))
    #                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
    #Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    1
    #Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    1
    #Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
    #Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
    #Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    1
    #Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-22
      • 2018-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-22
      相关资源
      最近更新 更多