Нахождение парных значений из строки на всем фрейме данных в R - PullRequest
0 голосов
/ 26 августа 2018

Я пытаюсь оттачивать свои навыки R и вроде как достигать своего лимита.

Проблема, которую я пытаюсь найти, заключается в следующем. Предположим, мой фрейм данных, как показано ниже,

n = c(2, 15, 31 , 33) 
n2 = c( 10 , 9, 10 , 40) 
n3 = c( 11 , 10 , 11 , 42) 
df = data.frame(n , n2 , n3)



> df
  n n2 n3
1  2 10 11
2 15  9 10
3 31 10 11
4 33 40 42

если я хотел бы пройти через каждую строку и сгенерировать случайную пару: например, 2,10 и пройти через каждую из остальных строк, чтобы найти повторяющуюся пару и распечатать общие пары и количество вхождений, как я могу это сделать?

В приведенном выше примере единственная повторяющаяся пара - это 10 и 11 в строках 1 и 3.

До сих пор я думал о псевдокоде следующим образом

for(each row in the dataframe)
{
  for (each of the values in the row)
   { 
     for every pair
   }
  find a repeated pair
  if found store in a dataframe
}

и найти случайную пару с помощью функции combn .

Но я немного растерялся в части итерации по строкам данных. Пожалуйста, помогите. Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Немного другой метод

n = c(2, 15, 31 , 15) # changed the dataset to have some common pairs in n and n2 too
n2 = c( 10 , 9, 10 , 9) 
n3 = c( 11 , 10 , 11 , 42) 
df = data.frame(n , n2 , n3)

library(dplyr)
library(rlang)
library(utils)

cols<-colnames(df) # define the columns that you want to do the pair checking for

combinations<- as.data.frame(combn(cols,2),stringsAsFactors = FALSE)
# picks up all combinations of columns


#iterates over each pair of columns
 all_combs<- lapply(names(combinations[cols1]), function(x){
    df %>%
      group_by(!! sym( combinations[[x]][1]),!! sym( combinations[[x]][2])) %>%
      filter(n()>1) # groups by the two columns, and filters out pairs that occur more than once. You can add a distinct command below if you 
#dont want them repeated


  })
 all_combs_df <- do.call("rbind", all_combs)# all_combs is in a list format, use rbind to convert into a dataframe
 all_combs_df

на выходе это

      n    n2    n3
  <dbl> <dbl> <dbl>
1   15.    9.   10.
2   15.    9.   42.
3    2.   10.   11.
4   31.   10.   11.
0 голосов
/ 26 августа 2018

Я думаю, это то, что вы хотите.Вместо того чтобы думать о выборе каждой комбинации из двух значений для каждой строки, мы получим каждую комбинацию из двух номеров столбцов - которая будет одинаковой для каждой строки.Затем мы используем plyr::count как вспомогательную функцию для подсчета строк с одинаковыми значениями сразу для всего фрейма данных.Таким образом, мы можем зацикливать комбинации индексов столбцов, а не строки.Я использую apply, но вместо этого вы могли бы написать его как цикл for.

pairs = combn(ncol(df), m = 2)
result = apply(pairs, MAR = 2, FUN = function(p) {
  plyr::count(df[p])
})
names(result) = apply(pairs, MAR = 2, FUN = paste, collapse = "_")

В результате получается list, где каждый элемент представляет собой фрейм данных с двумя столбцами и столбцом freq.давая количество строк в исходных данных каждой пары значений.

result
# $`1_2`
#    n n2 freq
# 1  2 10    1
# 2 15  9    1
# 3 31 10    1
# 4 33 40    1
# 
# $`1_3`
#    n n3 freq
# 1  2 11    1
# 2 15 10    1
# 3 31 11    1
# 4 33 42    1
# 
# $`2_3`
#   n2 n3 freq
# 1  9 10    1
# 2 10 11    2
# 3 40 42    1

Если вы хотите опустить значения, которые не повторяются, мы можем просто выделить их из подстановки:

lapply(result, subset, freq > 1)
# $`1_2`
# [1] n    n2   freq
# <0 rows> (or 0-length row.names)
# 
# $`1_3`
# [1] n    n3   freq
# <0 rows> (or 0-length row.names)
# 
# $`2_3`
#   n2 n3 freq
# 2 10 11    2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...