使用存储在不同dataframe中的值对dataframe的列进行变异
我创建了两个数据帧,其中使用存储在不同dataframe中的值对dataframe的列进行变异,r,dplyr,R,Dplyr,我创建了两个数据帧,其中df.1包含我的主要数据 ID A_ratio B_ratio C_ratio 1 0.9 7.6 3.5 2 3.1 4.4 0.7 3 6.3 8.2 1.2 数据帧cut仅包含一行 A_cut B_cut C_cut 4.5 5.3 2.0 现在我想使用cut中存储的值对df进行二值化,将X\u比率X\u cut转换为0。新列可以称为xu-bi
df.1
包含我的主要数据
ID A_ratio B_ratio C_ratio
1 0.9 7.6 3.5
2 3.1 4.4 0.7
3 6.3 8.2 1.2
数据帧cut
仅包含一行
A_cut B_cut C_cut
4.5 5.3 2.0
现在我想使用cut
中存储的值对df
进行二值化,将X\u比率X\u cut
转换为0
。新列可以称为xu-bin
。我尝试了以下dplyr
方法:
df.2 <- df.1 %>%
mutate(across(ends_with("ratio"), ~if_else(. <= get(cut[str_replace(cur_column(),"ratio","cut")]), 1, 0)
.names = "{.col}_bin"))%>%
rename_with(~str_replace(.,"_ratio",""),contains("_ratio_"))
select(ID, ends_with("bin"))
提前多谢 在
.names
之前缺少,
,如果我们从cut
中提取列,我们不需要任何get
,同时使用transmute
而不是mutate
,只返回所需的列,这样就可以删除select
的最后一步
library(dplyr)
library(stringr)
df.1 %>%
transmute(ID, across(ends_with("ratio"),
~if_else(. <= cut[[str_replace(cur_column(),"ratio","cut")]],
1, 0),
.names = "{.col}_bin")) %>%
rename_with(~str_replace(.,"_ratio",""),contains("_ratio_"))
当我们返回二进制列时,
if_else
不是真正需要的。可以使用作为.integer将逻辑向量强制为二进制,或使用+(
基本答案:
df.1[-1] <- +(sweep(df.1[-1], 2, unlist(cut), `<=`))
df.1
# ID A_ratio B_ratio C_ratio
#1 1 1 0 0
#2 2 1 1 1
#3 3 0 0 1
df.1[-1]purrr
df33001
由(v1.0.0)于2021-04-02创建。啊,非常感谢你的回答,效果非常好。也感谢你的非常有用的评论,从现在起,我一定会尝试遵循它们!谢谢!不知道有这么简单优雅的方法使用base R!
# ID A_bin B_bin C_bin
#1 1 1 0 0
#2 2 1 1 1
#3 3 0 0 1
df.1 %>%
transmute(ID, across(ends_with("ratio"),
~as.integer(. <= cut[[str_replace(cur_column(),"ratio","cut")]]),
.names = "{.col}_bin")) %>%
rename_with(~str_replace(.,"_ratio",""),contains("_ratio_"))
df.1 <- structure(list(ID = 1:3, A_ratio = c(0.9, 3.1, 6.3), B_ratio = c(7.6,
4.4, 8.2), C_ratio = c(3.5, 0.7, 1.2)), class = "data.frame", row.names = c(NA,
-3L))
cut <- structure(list(A_cut = 4.5, B_cut = 5.3, C_cut = 2), class = "data.frame",
row.names = c(NA,
-1L))
df.1[-1] <- +(sweep(df.1[-1], 2, unlist(cut), `<=`))
df.1
# ID A_ratio B_ratio C_ratio
#1 1 1 0 0
#2 2 1 1 1
#3 3 0 0 1