[英]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.