簡體   English   中英

tidyverse:將 data.frame 的每一行與另一個 data.frame 的單行進行比較

[英]tidyverse: Comparing each row of a data.frame with a single row from another data.frame

我想以整潔的方式將df1的每一行與df2的單行進行比較。 請有任何提示。

df1 <-
  structure(
    list(
        Q1 = c("a", "a")
      , Q2 = c("b", "a")
      , Q3 = c("a", "a")
      , Q4 = c("b", "a")
      )
    , class = "data.frame"
    , row.names = c(NA, -2L)
    )

df2 <-
  structure(
    list(
        Q1 = "a"
      , Q2 = "a"
      , Q3 = "b"
      , Q4 = "c"
      )
    , class = "data.frame"
    , row.names = c(NA, -1L)
    )

library(tidyverse)


sum(df1[1, ] == df2)
[1] 1
sum(df1[2, ] == df2)
[1] 2

在基地

apply(df1,1, function(x) sum(x == df2))

[1] 1 2

base R的選項是rowSums

rowSums(df1 == unlist(df2)[col(df1)])
#[1] 1 2

tidyverse中,我們也可以使用c_across

library(dplyr)
df1 %>% 
    rowwise %>%
    mutate(new = sum(c_across(everything()) == df2)) 
# A tibble: 2 x 5
# Rowwise: 
#  Q1    Q2    Q3    Q4      new
#  <chr> <chr> <chr> <chr> <int>
#1 a     b     a     b         1
#2 a     a     a     a         2

要么先拆分它並檢查身份:

library(purrr)
asplit(df1,1) %>% map_dbl(~sum(.==df2))

或者只是 map 行號:

1:nrow(df1) %>% map_dbl(function(i)sum(df1[i,]==df2))
[1] 1 2

基礎 R 解決方案。

按行比較和求和:

rowSums(mapply(`==`, df1, df2))
#[1] 1 2

編輯。

以上是這篇文章的新版本。 原始按列求和。 這是代碼。

返回值是一個邏輯向量列表,然后*apply function sum

Map(`==`, df1, df2)
#$Q1
#[1] TRUE TRUE
#
#$Q2
#[1] FALSE  TRUE
#
#$Q3
#[1] FALSE FALSE
#
#$Q4
#[1] FALSE FALSE

res <- Map(`==`, df1, df2)
sapply(res, sum)
#Q1 Q2 Q3 Q4 
# 2  1  0  0

單線將是

sapply(Map(`==`, df1, df2), sum)

另一個,更快。

colSums(mapply(`==`, df1, df2))
#Q1 Q2 Q3 Q4 
# 2  1  0  0

使用 purrr package:

unlist_df2 <- unlist(df2)
    seq_len(nrow(df1)) %>%
      map_lgl(~identical(unlist(df1[.x,]), unlist_df2))

編輯:將 map_lgl 更改為 map_dbl 並與 sum & == 相同

unlist_df2 <- unlist(df2)
seq_len(nrow(df1)) %>%
  map_dbl(~sum(unlist(df1[.x,]) == unlist_df2))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM