基于相应的列r替换列值
我有大约60个不同的列,30个列对应其余30个列的名称。我想基于其他相应的值替换这30列值基于相应的列r替换列值,r,tidyverse,R,Tidyverse,我有大约60个不同的列,30个列对应其余30个列的名称。我想基于其他相应的值替换这30列值 样本数据: df.wide可能会将您的数据放在长格式中: library(data.table) setDT(df.wide) dt.long = melt(df.wide, meas=patterns(IM = "^IM", LV = "^LV")) dt.long[, variable := c("A","B","C")[variable]] title variable IM LV
df.wide可能会将您的数据放在长格式中:
library(data.table)
setDT(df.wide)
dt.long = melt(df.wide, meas=patterns(IM = "^IM", LV = "^LV"))
dt.long[, variable := c("A","B","C")[variable]]
title variable IM LV
1: A A 0.5 0.7
2: B A 0.1 0.0
3: C A 4.6 2.5
4: D A 5.6 5.0
5: A B 0.2 1.0
6: B B 0.4 2.0
7: C B 2.6 4.5
8: D B 2.2 5.0
9: A C 2.0 3.0
10: B C 1.0 2.0
11: C C 3.0 5.0
12: D C 4.0 1.0
从这里可以轻松进行编辑:
dt.long[IM < 2.5, LV := 0]
如果需要相同的列顺序,则需要进一步的步骤:
setcolorder(res, names(df.wide))
title IM.A LV.A IM.B LV.B IM.C LV.C
1: A 0.5 0.0 0.2 0.0 2 0
2: B 0.1 0.0 0.4 0.0 1 0
3: C 4.6 2.5 2.6 4.5 3 5
4: D 5.6 5.0 2.2 0.0 4 1
您可以使用ifelse(df.wide$IM.A<2.5,0,df.wide$LV.A)
假设您的变量以df.wide
中所述的方式隔开(IM.x
和LV.x
都互相跟随),对于所有列,您可以这样做,其中3是第一列LV
,7是最后一列LV
df.wide[,seq(3,7, by = 2)] <- sapply(seq(3,7, by = 2), function(x)
ifelse(df.wide[,x-1] < 2.5, 0, df.wide[,x])
)
df.wide[,seq(3,7,by=2)]下面是一种使用developmenttidyr
pivot\uuu
函数的方法。您可以通过运行devtools::install\u github(“tidyverse/tidyr”)
获得这些信息
这展示了pivot函数的spec
功能,它允许您灵活地指定重塑格式。其工作方式是规范的每一行都是原始数据帧的输入列(如果使用pivot\u longer
)。.name
列包含输入列名,.value
列包含希望各个输入列中的值进入的新列的名称。在这里,我们希望将以“IM”
开头的列中的所有值放入IM
列中,类似地,对于LV
。最后,我们指定其他变量如何映射到列(这里只是letter
)
这使我们能够快速地将pivot\u加长
,使用if\u else
执行所需的替换,然后将pivot\u加宽
恢复到原始格式
库(tidyverse)
df.wide%colnames(),
`.value`=str_extract(`.name`,“^.{2}”),
letter=str_extract(`.name`,“{1}$”)
)
df.wide%>%
枢轴长度(规格=规格)%>%
变异(LV=if_else(IM<2.5,0,LV))%>%
枢轴(规格=规格)
#>#A tibble:4 x 7
#>标题IM.A LV.A IM.B LV.B IM.C LV.C
#>
#>1 A 0.50 0.2 0 2 0
#>2 B 0.1 0 0.4 0 1 0
#>3 C 4.6 2.5 2.6 4.5 3 5
#>4 D 5.6 5 2.2 0 4 1
由(v0.3.0)创建于2019-07-23,或通过T/F矩阵编制索引df.wide[grep(“LV”,名称(df.wide))][df.wide[grep(“IM”,名称(df.wide))]<2.5]
library(data.table)
setDT(df.wide)
dt.long = melt(df.wide, meas=patterns(IM = "^IM", LV = "^LV"))
dt.long[, variable := c("A","B","C")[variable]]
title variable IM LV
1: A A 0.5 0.7
2: B A 0.1 0.0
3: C A 4.6 2.5
4: D A 5.6 5.0
5: A B 0.2 1.0
6: B B 0.4 2.0
7: C B 2.6 4.5
8: D B 2.2 5.0
9: A C 2.0 3.0
10: B C 1.0 2.0
11: C C 3.0 5.0
12: D C 4.0 1.0
dt.long[IM < 2.5, LV := 0]
res = dcast(dt.long, title ~ variable, value.var=c("IM", "LV"), sep=".")
title IM_A IM_B IM_C LV_A LV_B LV_C
1: A 0.5 0.2 2 0.0 0.0 0
2: B 0.1 0.4 1 0.0 0.0 0
3: C 4.6 2.6 3 2.5 4.5 5
4: D 5.6 2.2 4 5.0 0.0 1
setcolorder(res, names(df.wide))
title IM.A LV.A IM.B LV.B IM.C LV.C
1: A 0.5 0.0 0.2 0.0 2 0
2: B 0.1 0.0 0.4 0.0 1 0
3: C 4.6 2.5 2.6 4.5 3 5
4: D 5.6 5.0 2.2 0.0 4 1
df.wide[,seq(3,7, by = 2)] <- sapply(seq(3,7, by = 2), function(x)
ifelse(df.wide[,x-1] < 2.5, 0, df.wide[,x])
)