Ваш пересмотренный вопрос в основном совершенно другой, поэтому я отвечу на него здесь.
Во-первых, я бы сказал, что ваша структура данных не имеет для меня особого смысла, поэтому я начну с того, что трансформирую ее во что-то, с чем я могу работать:
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