填充矩阵/数据帧的整合解决方案
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了填充矩阵/数据帧的整合解决方案相关的知识,希望对你有一定的参考价值。
我有一个包含单个列的数据框(命中)。这是填充了独特的搜索结果。
第二个数据帧(数据)包含各种搜索查询的结果。列名标识使用的搜索词,并使用搜索结果填充行。
我想构建一个矩阵或另一个数据框,根据搜索结果是否按列存在而填充。
我可以使用base R使用以下代码执行此操作:
library(tidyverse)
hit <- read_csv("hit
A1
A3
B2
B4
D3")
data <- read_csv("Search1, Search2, Search3, Search4
A1, B4, A3, A1
B4, D3, NA, B2
D3, NA, NA, B4")
search <- c("Search1", "Search2", "Search3", "Search4")
the_matrix <- matrix(data = NA, nrow = 5, ncol = 4)
rownames(the_matrix) <- hit$hit
colnames(the_matrix) <- search
for (i in search)
for (j in 1:3){
result <- data[[i]][[j]]
row_index <- which(rownames(the_matrix) == result)
the_matrix[row_index, i] <- 1
}
the_matrix[is.na(the_matrix)] <- 0
在我看来,应该有一种方法可以使用第一个数据框作为起点,用tidyverse实现相同的结果。从那里开始,使用搜索结果作为填充键,逐列引入第二个数据框。
有人可以帮忙吗?
答案
data %>% gather(na.rm=T) %>% mutate(p=1L) %>% spread("key", "p", fill=0L)
# A tibble: 5 x 5
value Search1 Search2 Search3 Search4
<chr> <int> <int> <int> <int>
1 A1 1 0 0 1
2 A3 0 0 1 0
3 B2 0 0 0 1
4 B4 1 1 0 1
5 D3 1 1 0 0
另一答案
为了您的信息,您还可以拥有一个相当优雅的基础解决方案
the_matrix=sapply(data,function(x) as.numeric(hit$hit%in%x))
rownames(the_matrix)<-hit$hit
另一答案
您可以将map_df
与match
结合使用,然后用0
替换a_tibble
中的所有非1L
s。
library(purrr)
library(tidyr)
a_tibble <- map_df(data, ~match(hit[["hit"]], ., nomatch = 0L))
a_tibble[a_tibble != 0] <- 1L
a_tibble %>%
add_column(., hit = hit$hit, .before = 1)
# A tibble: 5 x 4
# hit Search1 Search2 Search3 Search4
# <chr> <int> <int> <int> <int>
#1 A1 1 0 0 1
#2 A3 0 0 1 0
#3 B2 0 0 0 1
#4 B4 1 1 0 1
#5 D3 1 1 0 0
以上是关于填充矩阵/数据帧的整合解决方案的主要内容,如果未能解决你的问题,请参考以下文章