在dplyr和列中使用重命名时避免错误不存在

时间:2015-12-14 20:01:42

标签: r dplyr

在某些情况下,重命名的列不存在时,是否有一种在dplyr中使用重命名功能的聪明方法?

例如,我希望以下内容不会导致错误

mtcars%>%rename(miles_per_gallon=mpg,missing_varible=foo)

(结果如下:错误:未知变量:foo。)

而是完成所有可能重命名的数据框。

目前,我在重命名

之前明确检查特定列是否存在

由于

伊恩

8 个答案:

答案 0 :(得分:6)

有时可以不在dplyr中执行所有操作。这可能是其中之一。我会设置一个作为键操作的向量:

namekey <- c(mpg="miles_per_gallon", cyl="cylinders", disp="displacement", hp="horse_power",
             drat="rear_axle_ratio", wt="weight", qsec="quarter_mile_time", vs="v_s",
             am="transmission", gear="number_of_gears", carb="number_of_carburetors",
             foo="missing_variable")

mtcars1 <- mtcars[,1:2]
mtcars1$foo <- rnorm(nrow(mtcars1))

names(mtcars1) <- namekey[names(mtcars1)]

head(mtcars1)
#                   miles_per_gallon cylinders missing_variable
# Mazda RX4                     21.0         6       -0.9901081
# Mazda RX4 Wag                 21.0         6        0.2338014
# Datsun 710                    22.8         4       -0.3077473
# Hornet 4 Drive                21.4         6        1.1200518
# Hornet Sportabout             18.7         8        0.7482842
# Valiant                       18.1         6        0.4206614

获得密钥后,只需一行易于理解的代码即可进行重命名。

答案 1 :(得分:4)

plyr包具有rename()函数且warn_missing参数。

plyr::rename(
  mtcars, 
  replace      = c(mpg="miles_per_gallon", foo="missing_varible"),
  warn_missing = FALSE
)

如果您使用它,请考虑使用requireNamespace() instead of library(),因此其功能名称不会与dplyr发生冲突。

答案 2 :(得分:3)

也许不是设计者的意图,但是您可以使用范围动词rename_alldplyr函数recode,该函数采用一个或多个键值对,例如{{1} }。

old_name = "New Name"

答案 3 :(得分:2)

他们现在提到了使用 rename_with

mtcars %>% rename_with( ~"missing_varible", "foo")

请查看帮助以获取更多详细信息。

答案 4 :(得分:1)

又一个解决方案,可以使用条件评估{}在dplyr中安全运行而不会引发错误。如果存在“ foo”,则将应用重命名,但是在缺少名为“ foo”的列的情况下继续使用原始df执行。

mtcars %>%
{if("foo" %in% names(.)) rename(., missing_varible=foo) else .} %>%
rename(miles_per_gallon=mpg) 

答案 5 :(得分:1)

为了扩展 Tyler 船长提到的 rename_with,如果您(可能)有多个变量需要重命名,我发现使用 case_when 的这个解决方案效果很好并且易于阅读:

iris %>%
    rename_with(
        ~ case_when(
            . == "Petal.Width" ~ "NewPetalWidthName",
            . == "NotActuallyThere" ~ "DoNothing",
            TRUE ~ .
        )
    ) %>%
    head()

答案 6 :(得分:0)

首先,在数据框df中使用您要重命名的列名定义一个列表。

columnNamesToRename <-
    list(
      newColumnName1 = "oldColumnName1",
      newColumnName2 = "oldColumnName2"
    )

下一步,删除列表中的元素,这些元素以列名作为名称,但不是数据框的列名:

columnNamesToRename.WhichAreColumnNamesInTibble <-
columnNamesToRename[columnNamesToRename %in% intersect(
  unlist(columnNamesToRename),
  colnames(df)
)]

然后,您可以使用命名列表columnNamesToRename.WhichAreColumnNamesInTibble重命名列名称:

df.WithRenamedColumnNames <-
    df %>% dplyr::rename(!!!columnNamesToRename.WhichAreColumnNamesInTibble)

答案 7 :(得分:0)

您可以使用rename_at()完成此操作:

mtcars %>%
  rename_at(vars(matches("^missing_var$")), function(x) "foo")

如果data.frame中没有“ missing_var”,则不返回错误。 如果要替换可能存在或不存在的多个变量,可以将原始名称和新名称放入命名的向量/列表中,编写一个简短的小函数以返回新变量名称。

customRename <- function(orig_name) {
  renames <- c(
    foo = "OOF",
    bar = "RAB",
    fi = "IF")
  renames[[orig_name]]
}

mtcar %>%
  rename_at(vars(matches("^foo$|^bar$|^fi$")), customRename)