我有一个数据框和列列表,如下所示,我正在尝试更改列名列表中的值基础 即如果我的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
提前致谢。
答案 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, .)))