使用不同的列名在for循环中左键联接
我有一个名为使用不同的列名在for循环中左键联接,r,for-loop,left-join,cran,R,For Loop,Left Join,Cran,我有一个名为a的data.frame,其结构类似于:- a <- data.frame(X1=c("A", "B", "C", "A", "C", "D"), X2=c("B", "C", "D", "A", "B", "A"), X3=c("C", "D", "A", "B", "A", "B") ) 如何使用for循环中的左连接来实现这一点???在基本R中,我们可以取消列出数据帧,并将其与b
a
的data.frame,其结构类似于:-
a <- data.frame(X1=c("A", "B", "C", "A", "C", "D"),
X2=c("B", "C", "D", "A", "B", "A"),
X3=c("C", "D", "A", "B", "A", "B")
)
如何使用for循环中的左连接来实现这一点???在基本R中,我们可以
取消列出数据帧,并将其与b$Xn
匹配,以获得相应的特征值。我们可以cbind
将此数据帧绑定到原始数据帧以获得最终答案
temp <- a
temp[] <- b$Feature[match(unlist(temp), b$Xn)]
names(temp) <- paste0('Feature', seq_along(temp))
cbind(a, temp)
# X1 X2 X3 Feature1 Feature2 Feature3
#1 A B C some more what
#2 B C D more what why
#3 C D A what why some
#4 A A B some some more
#5 C B A what more some
#6 D A B why some more
这可以通过使用mutate_all
到recode
对a
中的所有列进行编码来实现:
library(tidyverse)
a %>%
mutate_all(funs(feat=recode(., !!!set_names(as.character(b$Feature), b$Xn))))
您可以在
处添加一个重命名\u以获得所需的名称:
a %>%
mutate_all(funs(f=recode(., !!!set_names(as.character(b$Feature), b$Xn)))) %>%
rename_at(vars(matches("f")), ~gsub(".([0-9]).*", "Feature\\1", .))
library(dplyr)
library(tidyr)
a %>%
mutate(row = row_number()) %>%
pivot_longer(cols = -row) %>%
left_join(b, by = c('value' = 'Xn')) %>%
select(-value) %>%
pivot_wider(names_from = name, values_from = Feature) %>%
select(-row) %>%
rename_all(~paste0('Feature', seq_along(.))) %>%
bind_cols(a, .)
library(tidyverse)
a %>%
mutate_all(funs(feat=recode(., !!!set_names(as.character(b$Feature), b$Xn))))
X1 X2 X3 X1_feat X2_feat X3_feat
1 A B C some more what
2 B C D more what why
3 C D A what why some
4 A A B some some more
5 C B A what more some
6 D A B why some more
a %>%
mutate_all(funs(f=recode(., !!!set_names(as.character(b$Feature), b$Xn)))) %>%
rename_at(vars(matches("f")), ~gsub(".([0-9]).*", "Feature\\1", .))
X1 X2 X3 Feature1 Feature2 Feature3
1 A B C some more what
2 B C D more what why
3 C D A what why some
4 A A B some some more
5 C B A what more some
6 D A B why some more