首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用来自多个数据帧的变量和合并过滤结果的自定义数据帧- Reprex可用

使用来自多个数据帧的变量和合并过滤结果的自定义数据帧- Reprex可用
EN

Stack Overflow用户
提问于 2020-07-10 16:03:23
回答 2查看 67关注 0票数 0

目标:创建一个自定义数据框架,该数据框架使用两个独立数据框架的变量。更具体地说,要使用在两个单独的数据帧中找到的name/id变量,请提取与name/id变量关联的特定变量,然后将输出自定义为一行代码以进行计算和模型格式化。

操作:下面的成功地使用了dplyr和for循环的组合来实现上述目标。此外,我还附上了这些步骤的照片和期望的输出,以帮助理解问题。

问题:对于这种情况,有更简单的解决方案吗?

下面,我有两个数据框架,我想使用自定义比较。数据帧1是带有状态名称的钻石。数据框架2有我想比较的名称。

第一个数据框架有我需要评估的关键变量。

第二个数据框架有两列名称,我想用来进行比较:

我希望使用第二个数据框架中的名称,从数据框架1中提取自定义变量,然后将它们放在同一行中进行计算。

代码语言:javascript
复制
library(tidyverse)
#Data frame 1 - Merge diamonds dataset w/ state names dataset
diamonds <- diamonds[1:50,]
diamonds$name <- state.name
#rearrange diamonds order
test_diamonds <- diamonds[, c(11, 1:10)]

#Data frame 2 - Create two lists for comparisons
example_names1 <- c("Alabama", "Alaska", "Arizona", "Arkansas")
example_names2 <- c("California", "Colorado", "Connecticut", "Delaware")
comp_names <- data.frame(Group1 = example_names1, Group2 = example_names2)

#combine 
df = NULL
for(i in 1:4){
test100 <- test_diamonds %>%
  filter(name == example_names1[i]) %>%
  select(name, depth, price)

test200 <- test_diamonds %>%
  filter(name == example_names2[i]) %>%
  select(name, depth, price)

df <- rbind(df, data.frame(test100, test200))
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-10 16:11:55

你可以试试这个。使用merge()避免循环。我希望这能帮到你。

代码语言:javascript
复制
#Merge
df1 <- merge(comp_names,test_diamonds[,c(1,6,8)],by.x='Group1',by.y = 'name',all.x=T)
#Merge again
df2 <- merge(df1,test_diamonds[,c(1,6,8)],by.x='Group2',by.y = 'name',all.x=T,suffixes = c(1,2))
#Arrange
df2 <- df2[,c(2,1,3:dim(df2)[2])]

    Group1      Group2 depth1 price1 depth2 price2
1  Alabama  California   61.5    326   63.3    335
2   Alaska    Colorado   59.8    326   62.8    336
3  Arizona Connecticut   56.9    327   62.3    336
4 Arkansas    Delaware   62.4    334   61.9    337
票数 1
EN

Stack Overflow用户

发布于 2020-07-10 16:24:17

这里有一个使用apply的选项

代码语言:javascript
复制
apply(comp_names, 1, function(x) {
  colnames = c("name", "depth", "price")
  
  cbind(test_diamonds[test_diamonds$name == x[["Group1"]], colnames],
        test_diamonds[test_diamonds$name == x[["Group2"]], colnames])
})%>%
  do.call("rbind",. )%>%
  setNames(., make.unique(names(.)))

      name depth price      name.1 depth.1 price.1
1  Alabama  61.5   326  California    63.3     335
2   Alaska  59.8   326    Colorado    62.8     336
3  Arizona  56.9   327 Connecticut    62.3     336
4 Arkansas  62.4   334    Delaware    61.9     337
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62838149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档