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中,非常高兴学习。我只是想知道是否有一个简单的方法来实现这一点。。。