根据条件使用其名称作为字符串替换一列中的值

时间:2019-06-26 08:50:55

标签: r dataframe slice

如果我有一个这样的数据框:

BR

我可以很高兴地替换public class UserViewModel extends BaseObservable { private String name; private Context context; public UserViewModel(User user) { this.name = name; } public UserViewModel(Context context) { this.context = context; } @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; notifyPropertyChanged(BR.name);//error } } 中大于df <- data.frame(c1=1:6, c2=2:7) 的值

c2

产生所需的输出

4

但是,我想使用字符串(在这种情况下为df$c2[df$c2 > 4] <- 10 )通过名称来选择列,因为该列选择不应该是硬编码的,而是取决于上下文。

我能想到的最好的是

  c1 c2
1  1  2
2  2  3
3  3  4
4  4 10
5  5 10
6  6 10

屈服

"c2"

它可以工作,但是我觉得它很难看。有没有更好的方法来做同样的事情?

4 个答案:

答案 0 :(得分:2)

也许使用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'][df['c2'] > 4] <- 100

答案 1 :(得分:2)

如果一个人对包裹开放,我们可以使用purrr的{​​{1}}或modify_at的{​​{1}}

dplyr

使用mutate_at

purrr::modify_at(df,"c2",
                 function(x) 
                   ifelse(x>4,100,x))

答案 2 :(得分:2)

使用transformifelse

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

答案 3 :(得分:1)

df[df$c2 > 4, 'c2'] <- 10
# or
df$c2 <- with(df, replace(c2, c2 > 4, 10)) 

您可以使用软件包data.table

library(data.table)
setDT(df)
df[c2 > 4, c2 := 10]