如何获得几个列组之间的差异

时间:2019-05-17 16:50:21

标签: r

我有这样的数据

DELETE FROM user_assignments

我有3组,每组有3列,分别称为X,T和P。

我试图找出每组中有多少行与另一组重叠,以及每组中有多少行与另一组不同。 (每组的每一行至少必须有2个值)

所以我正在寻找这样的输出

df<-structure(list(X1 = c(37L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, NA, 
11L, 12L), X2 = c(40L, NA, 35L, 35L, 35L, 34L, NA, 28L, 28L, 
NA, 25L, 24L), X3 = c(60L, 44L, 49L, 41L, NA, NA, NA, 25L, 26L, 
NA, NA, 22L), T1 = c(19L, 55L, 47L, 46L, 36L, 42L, 25L, NA, 33L, 
42L, 50L, 22L), T2 = c(75L, NA, 32L, 44L, 27L, 31L, 17L, NA, 
18L, 45L, 10L, 11L), T3 = c(5L, 6L, 7L, 8L, 9L, 10L, 11L, NA, 
46L, 36L, 42L, NA), P1 = c(2L, 2L, 3L, 4L, 2L, 6L, 7L, 8L, 9L, 
NA, 1L, 12L), P2 = c(40L, 44L, 4L, 2L, 1L, 1L, NA, 1L, 1L, 1L, 
5L, 55L), P3 = c(1L, 44L, 49L, 3L, NA, NA, NA, 25L, 26L, NA, 
NA, 66L)), class = "data.frame", row.names = c(NA, -12L))

这意味着我有10行X1,X2和X3,它们至少具有2个值,并且它们在组T中的值(T1,T2,T3)。有一行完全为空或只有1个值,但它们在T组中具有值。 其他组合相同

2 个答案:

答案 0 :(得分:0)

这个问题仍然是模棱两可和狭窄的,但这是整理数据的一般思路,以便可以轻松总结不同的组和/或行:

library(tidyverse)

df %>%
  as_tibble %>%
  rowid_to_column %>%
  gather(select=-rowid) %>%
  separate(key, into=c('group', 'column'), sep=1) %>%
  group_by(group)

答案 1 :(得分:0)

根据John Colby的回答延伸,您可以总结出每个字母列中填充有2个或更多非NA值的行:

<cfset stringWithoutLink = reReplaceNoCase(string, "\s*https?://[a-z0-9/_-]+", "", "all") />

然后使用它在字母之间进行比较。例如,在这里,我看到X和T列中9行的填充/未填充状态相同。这两个字母之间的三行(7、8和10)的填充状态不同。

library(tidyverse)
df_summarized <- df %>%
  rowid_to_column() %>%
  gather(colname, value, -rowid) %>%
  separate(colname, into = c("letter", "number"), sep = 1) %>%
  count(rowid, letter, wt = !is.na(value), name = "num_values") %>%
  mutate(populated = num_values >= 2)

> df_summarized
# A tibble: 36 x 4
   rowid letter num_values populated
   <int> <chr>       <int> <lgl>    
 1     1 P               3 TRUE     
 2     1 T               3 TRUE     
 3     1 X               3 TRUE     
 4     2 P               3 TRUE     
 5     2 T               2 TRUE     
 6     2 X               2 TRUE     
 7     3 P               3 TRUE     
 8     3 T               3 TRUE     
 9     3 X               3 TRUE     
10     4 P               3 TRUE 
# ... with 26 more rows

我们可以像这样查询数据以获取重叠和不重叠:

> df_summarized %>%
+   select(-num_values) %>%
+   spread(letter, populated)
# A tibble: 12 x 4
   rowid P     T     X    
   <int> <lgl> <lgl> <lgl>
 1     1 TRUE  TRUE  TRUE 
 2     2 TRUE  TRUE  TRUE 
 3     3 TRUE  TRUE  TRUE 
 4     4 TRUE  TRUE  TRUE 
 5     5 TRUE  TRUE  TRUE 
 6     6 TRUE  TRUE  TRUE 
 7     7 FALSE TRUE  FALSE    # T but no X
 8     8 TRUE  FALSE TRUE     # X but no T
 9     9 TRUE  TRUE  TRUE 
10    10 FALSE TRUE  FALSE    # T but no X
11    11 TRUE  TRUE  TRUE 
12    12 TRUE  TRUE  TRUE