Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用存储在不同dataframe中的值对dataframe的列进行变异_R_Dplyr - Fatal编程技术网

使用存储在不同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