R 使用名称作为字符串,根据条件替换一列中的值
如果我有这样一个数据帧:R 使用名称作为字符串,根据条件替换一列中的值,r,dataframe,slice,R,Dataframe,Slice,如果我有这样一个数据帧: df <- data.frame(c1=1:6, c2=2:7) 产生期望的输出 c1 c2 1 1 2 2 2 3 3 3 4 4 4 10 5 5 10 6 6 10 但是,我希望使用字符串按其名称选择列,在本例中为“c2”,因为列选择不应硬编码,而是依赖于上下文 我能想出的最好办法就是 df[,c('c2')][df[,c('c2')] > 4] <- 1000 这是可行的,但我觉得相当难看。有更好的方法做同样的事情吗
df <- data.frame(c1=1:6, c2=2:7)
产生期望的输出
c1 c2
1 1 2
2 2 3
3 3 4
4 4 10
5 5 10
6 6 10
但是,我希望使用字符串按其名称选择列,在本例中为“c2”
,因为列选择不应硬编码,而是依赖于上下文
我能想出的最好办法就是
df[,c('c2')][df[,c('c2')] > 4] <- 1000
这是可行的,但我觉得相当难看。有更好的方法做同样的事情吗?可能使用
replace
df['c2'] <- replace(df['c2'], df['c2'] > 4, 100)
df
# c1 c2
#1 1 2
#2 2 3
#3 3 4
#4 4 100
#5 5 100
#6 6 100
df['c2']4100)
df
#c1 c2
#1 1 2
#2 2 3
#3 3 4
#4 4 100
#5 5 100
#6 6 100
或者类似于你的尝试
df['c2'][df['c2'] > 4] <- 100
df['c2'][df['c2']>4]可能使用replace
df['c2'] <- replace(df['c2'], df['c2'] > 4, 100)
df
# c1 c2
#1 1 2
#2 2 3
#3 3 4
#4 4 100
#5 5 100
#6 6 100
df['c2']4100)
df
#c1 c2
#1 1 2
#2 2 3
#3 3 4
#4 4 100
#5 5 100
#6 6 100
或者类似于你的尝试
df['c2'][df['c2'] > 4] <- 100
df['c2'][df['c2']>4]如果一个人对软件包开放,我们可以使用purrr
的modify_at
或dplyr
的mutate_at
purrr::modify_at(df,"c2",
function(x)
ifelse(x>4,100,x))
使用dplyr
:
mutate_at(df,"c2",
function(x)
ifelse(x>4,100,x))
如果一个软件包是开放的,我们可以使用purrr
的modify\u at
或dplyr
的mutate\u at
purrr::modify_at(df,"c2",
function(x)
ifelse(x>4,100,x))
使用dplyr
:
mutate_at(df,"c2",
function(x)
ifelse(x>4,100,x))
使用transform
和ifelse
transform(df, c2 = ifelse(c2 > 4, 100, c2))
# c1 c2
#1 1 2
#2 2 3
#3 3 4
#4 4 100
#5 5 100
#6 6 100
如果我们需要传递一个字符串,一个带有dplyr
的选项是转换为符号并计算
library(dplyr)
df %>%
mutate(!! "c2" := replace(!! rlang::sym("c2"),
!! rlang::sym("c2") > 4, 100))
# c1 c2
#1 1 2
#2 2 3
#3 3 4
#4 4 100
#5 5 100
#6 6 100
使用transform
和ifelse
transform(df, c2 = ifelse(c2 > 4, 100, c2))
# c1 c2
#1 1 2
#2 2 3
#3 3 4
#4 4 100
#5 5 100
#6 6 100
如果我们需要传递一个字符串,一个带有dplyr
的选项是转换为符号并计算
library(dplyr)
df %>%
mutate(!! "c2" := replace(!! rlang::sym("c2"),
!! rlang::sym("c2") > 4, 100))
# c1 c2
#1 1 2
#2 2 3
#3 3 4
#4 4 100
#5 5 100
#6 6 100
这里面仍然有我想避免的df$c2
。datatable版本可以正常工作,但需要将其转换回数据帧。@Cleb$x
只是[[“x”]
的简写。您可以转换回setDF()
。这里面仍然有df$c2
,这是我想要避免的。datatable版本工作正常,但需要将其转换回数据帧。@Cleb$x
只是[[“x”]]
的缩写。你可以转换回setDF()
@Cleb刚刚意识到不需要[[
,single[
也可以。为什么[]
的链接?df[df['c2']>4,'c2'].@latemail:的确,我认为这是最好的解决方案。@Cleb刚刚意识到不需要[[
,single[
也有效。为什么要链接[]
?df[df['c2']>4,'c2']@thelatemail:事实上,我认为这是最好的解决方案。我需要c2
作为字符串。当我尝试转换时(df,'c2'=ifelse('c2'>41000,'c2'))
,然后将c2
中的所有值更新为1000
。有什么想法吗?@Cleb不进行评估。您需要转换为符号,如dplyr
s解决方案updated@Cleb我在这里也看到了没有引用表格的解决方案。这就是我发布答案的原因啊,不要误解我,对每个答案都感到高兴,而不是体验R中的rt,非常高兴学习。我只是想知道是否有一种简单的方法来实现这一点…我需要c2
作为字符串。当我尝试转换时(df,'c2'=ifelse('c2'>41000,'c2'))
,然后将c2
中的所有值更新为1000
。有什么想法吗?@Cleb不进行评估。您需要转换为符号,如dplyr
s解决方案updated@Cleb我在这里也看到了没有引用表格的解决方案。这就是我发布答案的原因啊,不要误解我,对每个答案都感到高兴,而不是体验rt在R中,非常高兴学习。我只是想知道是否有一个简单的方法来实现这一点。。。