繁体   English   中英

替换基于数据框列表的数据框的列值

[英]Replace Column Values of dataframe based List of Dataframes

dfs 列表:

catbehave <- c("Good", "Cute", "Evil")
catnum <- c(1, 2, 3)
dogbehave <- c("Goodboi", "Cute")
dognum <- c(4, 2)
mousebehave <- c("Evil", "Good", "Cute")
mousenum <- c(3, 1, 2)

cat <- as.data.frame(cbind(catbehave, catnum))
dog <- as.data.frame(cbind(dogbehave, dognum))
mouse <- as.data.frame(cbind(mousebehave, mousenum))


list.1 <- list(cat = cat,dog = dog,mouse = mouse)

df1:

cat <- c("Good", "Evil", "Evil", "Cute")
dog <- c("Goodboi", "Goodboi", "Cute", "Goodboi")
mouse<- c("Evil", "Good", "Cute", "Evil")
df1 = data.frame(cat, dog, mouse)

我想评估一个 dfs 列表以更改 df1 中的值。 需要对df1列使用list.1中 df 的名称

输出:

df1

cat  dog  mouse
1    4    3
3    4    1
3    2    2
2    4    3

一个基本的R选项,假设 list.1 和 df1 有一些顺序:

df1[] <- mapply(
  function(x, y) x[y],
  lapply(list.1, function(x) setNames(x[[2]], x[[1]])),
  df1
)
df1

#   cat dog mouse
# 1   1   4     3
# 2   3   4     1
# 3   3   2     2
# 4   2   4     3

您可以将match用于更新 join

for(i in names(df1)) {
   df1[,i] <- list.1[[i]][match(df1[,i], list.1[[i]][,1]), 2]
}
df1
#  cat dog mouse
#1   1   4     3
#2   3   4     1
#3   3   2     2
#4   2   4     3

使用tidyverse我们可以做到这一点

library(dplyr)
library(tibble)
library(purrr)
map2_dfc(df1, list.1, ~ deframe(.y)[.x])
# A tibble: 4 x 3
#  cat   dog   mouse
#  <chr> <chr> <chr>
#1 1     4     3    
#2 3     4     1    
#3 3     2     2    
#4 2     4     3    

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM