如何比较数据帧中第一行与其他行的字符串并计算R中的不匹配数?

问题描述 投票:1回答:2

我有一个包含数千行和列的数据框,在这里我需要计算从第一行到其他每行(row1–row2,row1–row3,row1–row4,…)的字符变量的变化,并输出总计更改数量进入新列。

df <- data_frame(
  a = c("1 2", "1 2", "2 2", "2 2"),
  b = c("2 1", "1 2", "1 2","1 2"),
  c = c("1 1", "1 2", "2 1","2 2"),
  d = c("1 1", "1 1", "2 1","2 1")
)

df
a     b     c     d    
  <chr> <chr> <chr> <chr>
1 1 2   2 1   1 1   1 1  
2 1 2   1 2   1 2   1 1  
3 2 2   1 2   2 1   2 1  
4 2 2   1 2   2 2   2 1

我想计算从第1行到第2行,从第1行到第3行的每个元素之间的字符不匹配,依此类推。这样我就知道了:

   a     b     c     d   e   
1 1 2   2 1   1 1   1 1  NA #No mismatches to count since this is the first row. 
2 1 2   1 2   1 2   1 1  3 
3 2 2   1 2   2 1   2 1  5
4 2 2   1 2   2 2   2 1  6

关于如何实现这一目标的任何想法?

r compare rows
2个回答
3
投票

dplyrpurrr一种方法可能是:

bind_cols(df, df %>%
           mutate_all(~ strsplit(., " ", fixed = TRUE)) %>%
           mutate_all(~ map2_int(.x = ., .y = .[1], ~ sum(.x != .y))) %>%
           transmute(e = rowSums(select(., everything()))))

  a     b     c     d         e
  <chr> <chr> <chr> <chr> <dbl>
1 1 2   2 1   1 1   1 1       0
2 1 2   1 2   1 2   1 1       3
3 2 2   1 2   2 1   2 1       5
4 2 2   1 2   2 2   2 1       6

0
投票

您也可以这样做:

library(dplyr)
library(purrr)

df %>%
  mutate(e = pmap(., ~toString(c(...)) %>% charToRaw),
         e = map_dbl(e, ~ sum(.x != e[[1]])))

# A tibble: 4 x 5
  a     b     c     d         e
  <chr> <chr> <chr> <chr> <dbl>
1 1 2   2 1   1 1   1 1       0
2 1 2   1 2   1 2   1 1       3
3 2 2   1 2   2 1   2 1       5
4 2 2   1 2   2 2   2 1       6
© www.soinside.com 2019 - 2024. All rights reserved.