Сравнение значений векторов путем сдвига рамки считывания - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть данные последовательности "Y maze", содержащие символы A, B, C. Я пытаюсь количественно определить, сколько раз эти три значения были найдены вместе. Данные выглядят так:

Animal=c(1,2,3,4,5)
VisitedZones=c(1,2,3,4,5)
data=data.frame(Animal, VisitedZones)
data[1,2]=("A,C,B,A,C,A,B,A,C,A,C,A,C,B,B,C,A,C,C,C")
data[2,2]=("A,C,B,A,C,A,B,A,C,A,C,A,C,B")
data[3,2]=("A,C,B,A,C,A,B,A,C,A")
data[4,2]=("A,C,B,A,C,A,A,A,B,A,C,A,C,A,C,B")
data[5,2]=("A,C,B,A,C,A,A,A,B,")

Сложность в том, что мне также нужно рассмотреть рамку чтения, чтобы найти все экземпляры комбинаций ABC. Есть три рамки для чтения, например:

enter image description here

Вот рабочий пример, который у меня есть.

Split <- strsplit(data$VisitedZones, ",", fixed = TRUE)
## How long is each list element?
Ncol <- vapply(Split, length, 1L)
## Create an empty character matrix to store the results
M <- matrix(NA_character_, nrow = nrow(data),ncol = max(Ncol),
        dimnames = list(NULL, paste0("V", sequence(max(Ncol)))))
## Use matrix indexing to figure out where to put the results
M[cbind(rep(1:nrow(data), Ncol),sequence(Ncol))] <- unlist(Split, 
         use.names = FALSE)
# Bind the values back together, here as a "data.table" (faster)
v2=data.table(Animal = data$Animal, M)
# I get error here
df=mutate(as.data.frame(v2),trio=paste0(v2,lead(v2),lead(v2,2)))
table(df$trio[1:(length(v2)-2)])

Было бы здорово, если бы я мог получить что-то вроде этого:

Animal   VisitedZones   ABC  ACB  BCA  BAC  CAB  CBA
  1      A,B,C,A,B.C...  2    0    1    0    1    0
  2      A,B,C,C...      1    0    0    0    0    0
  3      A,C,B,A...      0    1    0    0    0    1

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Ваш пересмотренный вопрос в основном совершенно другой, поэтому я отвечу на него здесь.

Во-первых, я бы сказал, что ваша структура данных не имеет для меня особого смысла, поэтому я начну с того, что трансформирую ее во что-то, с чем я могу работать:

v2<-as.data.frame(t(v2))

Переверните, чтобы буквы были в столбцах, а не в строках;

v2<-tidyr::gather(v2,"v","letter",na.rm=T)

Растопить таблицу, чтобы она содержала длинные данные (чтобы я мог использовать свинец и т. Д.).

v2<-group_by(v2,v)
df=mutate(v2,trio=paste0(letter,lead(letter),lead(letter,2)))

Это возвращает нас, в основном, к тому месту, где мы были в конце последнего вопроса, только данные сгруппированы по переменной «animal» (здесь она называется «v» и представлена ​​от V1 до V5).

df<-df[!grepl("NA",df$trio),]

Даже несмотря на то, что мы удалили ненужные NA, у нас все еще остаются те противные ABNA, ANANA и т. Д. В конце каждой группы, поэтому эта строка удалит все, что содержит NA.

tt<-table(df$v,df$trio)

И, наконец, мы создаем таблицу, но также разбиваем ее на "v". Результат таков:

     AAA AAB ABA ACA ACB ACC BAC BBC BCA CAA CAB CAC CBA CBB CCC
  V1   0   0   1   3   2   1   2   1   1   0   1   3   1   1   1
  V2   0   0   1   3   2   0   2   0   0   0   1   2   1   0   0
  V3   0   0   1   2   1   0   2   0   0   0   1   0   1   0   0
  V4   1   1   1   3   2   0   2   0   0   1   0   2   1   0   0
  V5   1   1   0   1   1   0   1   0   0   1   0   0   1   0   0

Теперь вы можете привязать его к исходному data, чтобы получить что-то похожее на то, что вы описали, но для этого требуется просто дополнительный шаг, поскольку table сохраняет свои результаты:

data<-cbind(data,spread(as.data.frame(tt),Var2,Freq))[,-3]

Что в итоге будет выглядеть так:

  Animal                            VisitedZones AAA AAB ABA ACA ACB ACC BAC BBC BCA CAA CAB CAC CBA CBB CCC
1      1 A,C,B,A,C,A,B,A,C,A,C,A,C,B,B,C,A,C,C,C   0   0   1   3   2   1   2   1   1   0   1   3   1   1   1
2      2             A,C,B,A,C,A,B,A,C,A,C,A,C,B   0   0   1   3   2   0   2   0   0   0   1   2   1   0   0
3      3                     A,C,B,A,C,A,B,A,C,A   0   0   1   2   1   0   2   0   0   0   1   0   1   0   0
4      4         A,C,B,A,C,A,A,A,B,A,C,A,C,A,C,B   1   1   1   3   2   0   2   0   0   1   0   2   1   0   0
5      5                      A,C,B,A,C,A,A,A,B,   1   1   0   1   1   0   1   0   0   1   0   0   1   0   0
0 голосов
/ 14 сентября 2018
df<-mutate(as.data.frame(v2),trio=paste0(v2,lead(v2),lead(v2,2)))
table(df$trio[1:(length(v2)-2)])

Используя dplyr, я генерирую для каждой буквы в вашем векторе трехбуквенную комбинацию, которая начинается с него, затем создаю таблицу частот всех найденных комбинаций (за исключением двух последних, которые являются неполными).

Результат:

AAB ABC BCA CAA CAB    
  1   6   5   1   4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...