更简洁的方法来替换 tibble 列表中的值
Cleaner way to replace values in a tibble list
我正在尝试想出一种更简洁的方法(更少输入)来替换大标题列表中的值。从网上看,使用子集而不是 $ 来替换值似乎很常见,如下所示:
mtcars["cyl"][mtcars["cyl"] == 4] <- 6
我想用更少的代码来执行此操作,因为我需要手动执行此操作(使用不同的替换)2-3 次,以处理此 tibble 中的 200 多个列。我的 tibble 名称和列名称也很长,这很麻烦。
我尝试编写自己的函数来做同样的事情,但我无法让它工作:
val_set <- function(df, column, old_value, replace) {
df[column][df[column] == old_value] <- replace
}
然后我了解了替换功能,但我只能让它与$一起使用而不能与[]一起使用。当我使用 View() 检查更改时,值保持不变。这与使用 $ vs [] 有关系吗?
replace(mtcars$cyl, mtcars$cyl == 4, 6)
最安全、最快的方法是什么?
正如您在关于使用 replace
的问题的第二部分中提到的,我认为您应该将列名视为字符。将您的代码更改为:
replace(mtcars["cyl"], mtcars["cyl"] == 4, 6)
只是我们需要将它赋值回对象
val_set <- function(df, column, old_value, replace) {
df[[column]][df[[column]] == old_value] <- replace
df
}
mtcars <- val_set(mtcars, 'cyl', 4, 6)
现在,检查 'mtcars' 'cyl' 列
mtcars$cyl
[1] 6 6 6 6 8 6 8 6 6 6 6 8 8 8 8 8 8 6 6 6 6 8 8 8 8 6 6 6 8 6 8 6
您可以使用 within
并避免创建您自己的自定义函数。这使代码更清晰易读。
within(mtcars, cyl[cyl == 4] <- 6)
我正在尝试想出一种更简洁的方法(更少输入)来替换大标题列表中的值。从网上看,使用子集而不是 $ 来替换值似乎很常见,如下所示:
mtcars["cyl"][mtcars["cyl"] == 4] <- 6
我想用更少的代码来执行此操作,因为我需要手动执行此操作(使用不同的替换)2-3 次,以处理此 tibble 中的 200 多个列。我的 tibble 名称和列名称也很长,这很麻烦。
我尝试编写自己的函数来做同样的事情,但我无法让它工作:
val_set <- function(df, column, old_value, replace) {
df[column][df[column] == old_value] <- replace
}
然后我了解了替换功能,但我只能让它与$一起使用而不能与[]一起使用。当我使用 View() 检查更改时,值保持不变。这与使用 $ vs [] 有关系吗?
replace(mtcars$cyl, mtcars$cyl == 4, 6)
最安全、最快的方法是什么?
正如您在关于使用 replace
的问题的第二部分中提到的,我认为您应该将列名视为字符。将您的代码更改为:
replace(mtcars["cyl"], mtcars["cyl"] == 4, 6)
只是我们需要将它赋值回对象
val_set <- function(df, column, old_value, replace) {
df[[column]][df[[column]] == old_value] <- replace
df
}
mtcars <- val_set(mtcars, 'cyl', 4, 6)
现在,检查 'mtcars' 'cyl' 列
mtcars$cyl
[1] 6 6 6 6 8 6 8 6 6 6 6 8 8 8 8 8 8 6 6 6 6 8 8 8 8 6 6 6 8 6 8 6
您可以使用 within
并避免创建您自己的自定义函数。这使代码更清晰易读。
within(mtcars, cyl[cyl == 4] <- 6)