簡體   English   中英

如何比較 R 中 dataframe 到 dataframe 的每一行?

[英]How to compare every row of dataframe to dataframe in R?

我想獲得等於 dataframe 中每隔一行的值的數量:

library(tidyverse)

df <- tibble(
  a = c(1, 1, 5, 1),
  b = c(2, 3, 2, 8),
  c = c(2, 6, 2, 2)
)

所需的 output:

# A tibble: 4 x 4
      a     b     c desired_column
  <dbl> <dbl> <dbl> <list>        
1     1     2     2 <dbl [4]>     
2     1     3     6 <dbl [4]>     
3     5     2     2 <dbl [4]>     
4     1     8     2 <dbl [4]> 

在此處輸入圖像描述

在“desired_column”列中:第一行:3、1、2、2:

3:是因為第一行的三個值與其自身相比是相同的

1:是因為在兩行和同一列(第一和第二)中都有一個具有相同值的值:

在此處輸入圖像描述

2:第一行和第三行同一列有兩個值相等:

在此處輸入圖像描述

2:第一行和第四行同一列有兩個值相等:

在此處輸入圖像描述

“desired_column”的第二、三、四行是同一個過程的結果:結果中的第i個數字是當前行和第i行共有值的個數

我的方法是將數據連接到自身,制作一個表格,將每個值與每個原始行中該列的值進行比較。 然后我們再次計算匹配和 pivot 更寬。

df %>%
  rowid_to_column() %>%
  pivot_longer(-rowid) -> df2

left_join(df2, df2, by = "name") %>%
  count(rowid.x, rowid.y, wt = value.x == value.y) %>%     # Edit - shorter
  pivot_wider(names_from = rowid.y, values_from = n) %>%
  nest(desired_column = c(`1`:`4`)) %>%
  select(-rowid.x) -> matches

bind_cols(df, matches)


# A tibble: 4 x 4
      a     b     c desired_column  
  <dbl> <dbl> <dbl> <list>          
1     1     2     2 <tibble [1 × 4]>
2     1     3     6 <tibble [1 × 4]>
3     5     2     2 <tibble [1 × 4]>
4     1     8     2 <tibble [1 × 4]>


> matches %>%
+   unnest(cols = c(desired_column))
# A tibble: 4 x 4
    `1`   `2`   `3`   `4`
  <int> <int> <int> <int>
1     3     1     2     2
2     1     3     0     1
3     2     0     3     1
4     2     1     1     3

您可以這樣做:簡而言之,對於 dataframe 的每一行,將其復制以創建一個新的 dataframe 並將所有值更改為該行,並將 Z6A8064B5DF479455500553C47Chether550 的值與原始值進行比較。 每個比較的rowSums將為您提供所需的向量。

# Create the desired output in list 
lst <- 
  lapply(1:nrow(df), function(nr) {
     rowSums(replicate(nrow(df), df[nr, ], simplify = FALSE) %>% 
             do.call("rbind", .) == df)})

# To create the desired dataframe
df %>% tibble(desired_column = I(lst))

在最后一行的tibble調用中, I()用於將列表 output 作為列放入。

另一種方法是使用幾個 for 循環來制作 function:

count_combs <- function(df){
output <- list()
vector <- NULL
for(i in 1:nrow(df)){
  for(j in 1:nrow(df)){
  vector[j] <- sum(df[i,] %in% df[j,])
}
output[[i]] <- vector
}
return(output)
}

df$desired_column<- count_combs(df)

這里 count_combs function 計算每行迭代一次 i 和 j 一次的組合,每次行元素是比較行的 %in% 時求和。

暫無
暫無

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

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