如果我有一个这样的数据框:
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"
它可以工作,但是我觉得它很难看。有没有更好的方法来做同样的事情?
答案 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)
使用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
答案 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]