使用来自多个数据框的变量并合并过滤结果的自定义数据框 - Reprex 可用
Custom Data Frame Using Variables from Multiple Data Frames and Merging Filtered Results - Reprex Available
目标: 创建一个使用两个独立数据框变量的自定义数据框。更具体地说,要使用在两个单独的数据框中找到的 name/id 变量,提取与 name/id 变量关联的特定变量,然后将输出自定义为一行代码以进行评估和模型格式化.
操作: 下面,我成功地使用了 dplyr 和 for 循环的组合来实现上述目标,但效率低下。此外,我附上了步骤和所需输出的照片,以帮助理解问题。
问题:对于这种情况有更简单的解决方案吗?
下面,我有两个要用于自定义比较的数据框。数据框 1 是附有州名的菱形。数据框 2 有我想比较的名称。
第一个数据框包含我需要评估的关键变量。
第二个数据框有两列我想用来比较的名称:
我想使用第二个数据框中的名称,从数据框 1 中提取自定义变量,然后将它们放在同一行以进行评估。
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))
}
你可以试试这个。使用 merge()
避免循环。希望对您有所帮助。
#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
这是一个使用 apply
的选项:
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
目标: 创建一个使用两个独立数据框变量的自定义数据框。更具体地说,要使用在两个单独的数据框中找到的 name/id 变量,提取与 name/id 变量关联的特定变量,然后将输出自定义为一行代码以进行评估和模型格式化.
操作: 下面,我成功地使用了 dplyr 和 for 循环的组合来实现上述目标,但效率低下。此外,我附上了步骤和所需输出的照片,以帮助理解问题。
问题:对于这种情况有更简单的解决方案吗?
下面,我有两个要用于自定义比较的数据框。数据框 1 是附有州名的菱形。数据框 2 有我想比较的名称。
第一个数据框包含我需要评估的关键变量。
第二个数据框有两列我想用来比较的名称:
我想使用第二个数据框中的名称,从数据框 1 中提取自定义变量,然后将它们放在同一行以进行评估。
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))
}
你可以试试这个。使用 merge()
避免循环。希望对您有所帮助。
#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
这是一个使用 apply
的选项:
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