在行R

时间:2018-02-07 13:30:39

标签: r algorithm combinations

我试图在数据框架中找到类似的数字模式。我有一个包含5列的数据框,有些列的随机数在3到50之间。但是,对于某些行,2或3列没有数字。

A   B    C   D   E
5   23   6 
9   33   7   8   12
33   7   14  
6   18   23  48 
8   44   33  7  9 

我想知道经常性的数字是什么,所以我对:

感兴趣
  • 第1行和第4行,编号为23和6,
  • 第2行和第5行,编号为9,33和8,
  • 第2,3和5行,编号为33和7。

基本上我试图获得不同组合的数量。

我有点担心如何做到这一点。我已经尝试将这些数字加入到列表中。

for (i in 1:dim(knots_all)[1]) {
    knots_all$list_knots <- list(sort(knots_all[i,1:5]))
}

我也试过intersect,但它看起来效率不高,因为R也考虑了我想忽视的NAs。

我想听听有关实现这一目标的最佳方法的一些想法。我一直在考虑这个问题,但我无法理解如何找到答案。我的思绪被卡住了所以任何想法都非常感激!

谢谢!

4 个答案:

答案 0 :(得分:1)

您没有要捕获的特定/目标模式。您似乎需要一个流程来识别数据集中更常出现的数字,然后查看它们出现在哪些行中。

我将修改你的示例数据集,让数字23出现在同一行中两次,以说明计数中的一些有用差异。

df = read.table(text = "
A   B    C   D   E
5   23   6   23  NA
9   33   7   8   12
33   7   14  NA  NA
6   18   23  48  NA
8   44   33  7  9 
", header=T)

library(dplyr)
library(tidyr)


df %>%
  mutate(row_id = row_number()) %>%          # add a row flag
  gather(col_name,value,-row_id) %>%         # reshape
  filter(!is.na(value)) %>%                  # exclude NAs
  group_by(value) %>%                        # for each number value
  summarise(NumOccurences = n(),                             # count occurences
            rows = paste(sort(row_id), collapse = "_"),      # capture rows
            NumRowOccurences = n_distinct(row_id),           # count occurences in unique rows
            unique_rows = paste(sort(unique(row_id)), collapse = "_")) %>%  # capture unique rows
  arrange(desc(NumOccurences))                               # order by number popularity (occurences)

# # A tibble: 12 x 5
#    value NumOccurences rows  NumRowOccurences unique_rows
#    <int>         <int> <chr>            <int> <chr>      
# 1     7             3 2_3_5                3 2_3_5      
# 2    23             3 1_1_4                2 1_4        
# 3    33             3 2_3_5                3 2_3_5      
# 4     6             2 1_4                  2 1_4        
# 5     8             2 2_5                  2 2_5        
# 6     9             2 2_5                  2 2_5        
# 7     5             1 1                    1 1          
# 8    12             1 2                    1 2          
# 9    14             1 3                    1 3          
# 10   18             1 4                    1 4          
# 11   44             1 5                    1 5          
# 12   48             1 4                    1 4   

答案 1 :(得分:0)

列出清单:

List = [1[],2[],...,n[]].

循环浏览您的数据框,例如广告A到列表= [1 [],2 [],。5 [A] ..,[n]](索引= 5)。每个专栏都是如此。

在循环列表之后检查列表(在列表中)是否已填充且具有多列。

这应该让你开始。 祝你好运

答案 2 :(得分:0)

这是一种可以检测两列中的数字的算法。

df <- data.frame(A = c(5, 23, 6, NA, NA),
          B = c(9, 33, 7, 8, 12),
          C = c(33, 7, 14, NA, NA),
          D = c(6, 18, 23, 48, NA),
          E = c(8, 44, 33, 7, 9))

L <- as.list(df)


LL <- rep(list(rep(list(NA), length(L))), length(L))

for(i in 1:length(L)){
  for(j in 1:length(L))
    LL[[i]][[j]] <- intersect(L[[i]], L[[j]])
}

要查看第1列和第4列中的重叠数字:

LL[[1]][[4]]
[1] 23  6 NA

要查看所有过度数字:

unique(unlist(LL))
[1]  5 23  6 NA  9 33  7  8 12 14 18 48 44

可以稍微更改一下(通过在嵌套循环中添加一个级别,如果是for循环),可以在3个不同的列中查看等级

答案 3 :(得分:0)

处理NA的一个例子是临时用随机生成的数字填充它们:

# data
df <- data.frame(A = c(5,9,33,6,8),
                 B = c(23,33,7,18,44),
                 C = c(6,7,14,23,33),
                 D = c(NA, 8, NA, 48, 7),
                 E = c(NA, 12, NA, NA, 9))

# fill NA with random numbers
set.seed(1)
df2 <- as.data.frame(do.call(cbind, lapply(df, function(x) ifelse(is.na(x), rnorm(1), x))))

> df2
   A  B  C          D          E
1  5 23  6 -0.6264538  0.1836433
2  9 33  7  8.0000000 12.0000000
3 33  7 14 -0.6264538  0.1836433
4  6 18 23 48.0000000  0.1836433
5  8 44 33  7.0000000  9.0000000


# split data by rows
df2 <- split(df2, seq_along(df2))

# compare rows with each other
temp <- lapply(lapply(df2, function(x) lapply(df2, function(y) x %in% y)), function(x) do.call(rbind, x))

# delete self comparisons
output <- lapply(1:5, function(x) temp[[x]] <- temp[[x]][-x,])

结果:

[[1]]
   [,1]  [,2]  [,3]  [,4]  [,5]
2 FALSE FALSE FALSE FALSE FALSE
3 FALSE FALSE FALSE  TRUE  TRUE
4 FALSE  TRUE  TRUE FALSE  TRUE
5 FALSE FALSE FALSE FALSE FALSE

[[2]]
   [,1]  [,2]  [,3]  [,4]  [,5]
1 FALSE FALSE FALSE FALSE FALSE
3 FALSE  TRUE  TRUE FALSE FALSE
4 FALSE FALSE FALSE FALSE FALSE
5  TRUE  TRUE  TRUE  TRUE FALSE

[[3]]
   [,1]  [,2]  [,3]  [,4]  [,5]
1 FALSE FALSE FALSE  TRUE  TRUE
2  TRUE  TRUE FALSE FALSE FALSE
4 FALSE FALSE FALSE FALSE  TRUE
5  TRUE  TRUE FALSE FALSE FALSE

[[4]]
   [,1]  [,2]  [,3]  [,4]  [,5]
1  TRUE FALSE  TRUE FALSE  TRUE
2 FALSE FALSE FALSE FALSE FALSE
3 FALSE FALSE FALSE FALSE  TRUE
5 FALSE FALSE FALSE FALSE FALSE

[[5]]
   [,1]  [,2]  [,3]  [,4]  [,5]
1 FALSE FALSE FALSE FALSE FALSE
2  TRUE FALSE  TRUE  TRUE  TRUE
3 FALSE FALSE  TRUE  TRUE FALSE
4 FALSE FALSE FALSE FALSE FALSE