如何根据列名列表更改数据框中的值

时间:2017-12-14 05:58:08

标签: r

我有一个数据框和列列表,如下所示,我正在尝试更改列名列表中的值基础 即如果我的df中的列与列列表匹配,并且如果值> 1则在这些列中匹配,则将这些值设为1,否则使用相同的值

grp = c("A","A","A","A","A","A","A")
value_1 =c(10,21,33,31,423,132,245)
value_2 = c(0,0,NA,1.5,1.75,1,NA)
value_3 = c(10,30,NA,1.0,1.3,1.4,50)
value_4 = c(0,0,NA,1.5,1.75,1,NA)
value_5 = c(1,1.25,0,1.5,0,NA,0)

df =  data.frame(grp,value_1,value_2,value_3,value_4,value_5)

lis = c('value_2','value_4','value_5')

获取desired_df我尝试使用以下代码

df1 = df %>%
          mutate(lis = ifelse(names(df) >1,1,names(df)))

帮助我获得如下输出

grp_1   value_1 value_2 value_3 value_4 value_5
A         10     0        10       0    1
A         21     0        30       0    1
A         33    NA       NA       NA    0
A         31    1        1         1    1
A        423    1        1         1    0
A         132   1        1         1    NA
A         245   NA      50        NA    0

提前致谢。

2 个答案:

答案 0 :(得分:1)

作为ifelse的替代方案,您还可以考虑replace,基本上是vector[index] <- values

在实际应用程序中,您可以执行以下操作:

df[lis] <- lapply(df[lis], function(x) replace(x, x > 1, 1))
# Or
# df[lis] <- lapply(df[lis], function(x) { x[x > 1] <- 1; x})
df
#   grp value_1 value_2 value_3 value_4 value_5
# 1   A      10       0    10.0       0       1
# 2   A      21       0    30.0       0       1
# 3   A      33      NA      NA      NA       0
# 4   A      31       1     1.0       1       1
# 5   A     423       1     1.3       1       0
# 6   A     132       1     1.4       1      NA
# 7   A     245      NA    50.0      NA       0

使用相同的逻辑,您可以使用data.table执行以下操作:

library(data.table)
setDT(df)[, (lis) := lapply(.SD, function(x) {x[x > 1] <- 1; x}), .SDcols = lis][]
#    grp value_1 value_2 value_3 value_4 value_5
# 1:   A      10       0    10.0       0       1
# 2:   A      21       0    30.0       0       1
# 3:   A      33      NA      NA      NA       0
# 4:   A      31       1     1.0       1       1
# 5:   A     423       1     1.3       1       0
# 6:   A     132       1     1.4       1      NA
# 7:   A     245      NA    50.0      NA       0

答案 1 :(得分:0)

我们可以使用mutate_at来指定存储在&#39;列表中的列名称。对象和funs内的mutate列{/ 1>

library(dplyr)
df %>%
    mutate_at(lis, funs(ifelse(.> 1, 1, .)))