2016-03-02 8 views
-1

У меня есть ряд чисел, которые составляют 0 или 1. общая длина 35115, или если вы берете 35115/15, вы имеете 2341 блок. Я хочу пройти через каждый блок и посмотреть, соответствует ли мой вектор tmp интересующей колонке, содержащей блоки. Я хочу поместить свой файл данных, но сделайте шаги 15 и спросите, соответствуют ли эти 15 моим вектором. Что я делаю неправильно? Кто-нибудь может мне помочь? Спасибо всем за то, что вы научили меня чему-то полезному. ПриветствияИспользуйте для цикла, чтобы сделать шаги из 15 и сопоставить вектор с колонкой dataframe

x; 
     V1  V2 V3 V4 V5 V6 V7 
3R 11024348 A G A1 0 61 
3R 11024348 A G A2 1 30 
3R 11024348 A G A3 0 68 
3R 11024348 A G A4 0 57 
3R 11024348 A G A5 0 63 
3R 11024348 A G A6 0 49 
3R 11024348 A G A7 0 60 
3R 11024348 A G B1 0 63 
3R 11024348 A G B2 0 64 
3R 11024348 A G B3 0 71 
3R 11024348 A G B4 1 51 
3R 11024348 A G B5 0 37 
3R 11024348 A G B6 0 52 
3R 11024348 A G B7 0 47 
3R 11024348 A G AB8 0 83 
3R 11024410 C T A1 0 45 
3R 11024410 C T A2 1 54 
3R 11024410 C T A3 0 76 
3R 11024410 C T A4 0 48 
3R 11024410 C T A5 0 49 
3R 11024410 C T A6 1 48 
3R 11024410 C T A7 0 45 
3R 11024410 C T B1 0 48 
3R 11024410 C T B2 0 81 
3R 11024410 C T B3 1 58 
3R 11024410 C T B4 1 50 
3R 11024410 C T B5 0 65 
3R 11024410 C T B6 1 45 
3R 11024410 C T B7 0 66 
3R 11024410 C T AB8 0 58 


tmp<-c(1,1,0,1,1,1,1,1,1,1,1,1,0,0,0) 
for(i in seq(from=1, to=length(X$V6), by=15)){print(matchID<-match(tmp,X$V6[i]))} 
+0

Укажите минимальный воспроизводимый пример. – Roland

+0

Roland все данные работали бы, но вот небольшой кусочек реальных данных. Я хочу совместить x $ V6 с tmp с шагом 15. Здесь будет два шага. – Genetics

+0

Почему это получает отрицательные голоса? Я предоставляю конкретную проблему с конкретными потребностями и пример цикла, который я не могу получить на работу? – Genetics

ответ

1

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

что-то вроде matchID<-vector()

давайте посмотрим на код:

for(i in seq(from=1, to=length(X$V6), by=15)){print(matchID<-match(tmp,X$V6[i]))} 

ваше для функции вызывает цикл от 1 до 30 (длина V6) скачок на 15 (длина TMP), так что это собирается вернуться:

>for(i in seq(1,30,15)) print(i) 
[1] 1 
[1] 16 

так что если вы проиндексировать ваш вектор V6 на г, цикл будет возвращать значение только на 1 и 16.

Вот мое решение:

matchID<-vector() # stores the loop return in a vector 
for(i in 1:length(x[, "V6"]){ 
    matchID[i]<- as.numeric(tmp == x[, "V6"])[i] 
} 

вы можете увидеть, что для я го элемента в matchID, она всегда равна я го элемента в векторе сравнения темп и «V6».

Однако, вы действительно не нужен цикл в этом случае

matchID<-as.numeric(tmp == x[, "V6"]) 
+0

Спасибо, Майк, это была огромная помощь. У меня был мыслительный процесс о том, как это сделать, и получил 3 ответа. – Genetics

1

Я не совсем уверен, что в отношении ожидаемого результата, но, возможно, это:

Сначала воспроизводят данные:

x <- read.table(text = "  V1  V2 V3 V4 V5 V6 V7 
3R 11024348 A G A1 0 61 
       3R 11024348 A G A2 1 30 
       3R 11024348 A G A3 0 68 
       3R 11024348 A G A4 0 57 
       3R 11024348 A G A5 0 63 
       3R 11024348 A G A6 0 49 
       3R 11024348 A G A7 0 60 
       3R 11024348 A G B1 0 63 
       3R 11024348 A G B2 0 64 
       3R 11024348 A G B3 0 71 
       3R 11024348 A G B4 1 51 
       3R 11024348 A G B5 0 37 
       3R 11024348 A G B6 0 52 
       3R 11024348 A G B7 0 47 
       3R 11024348 A G AB8 0 83 
       3R 11024410 C T A1 0 45 
       3R 11024410 C T A2 1 54 
       3R 11024410 C T A3 0 76 
       3R 11024410 C T A4 0 48 
       3R 11024410 C T A5 0 49 
       3R 11024410 C T A6 1 48 
       3R 11024410 C T A7 0 45 
       3R 11024410 C T B1 0 48 
       3R 11024410 C T B2 0 81 
       3R 11024410 C T B3 1 58 
       3R 11024410 C T B4 1 50 
       3R 11024410 C T B5 0 65 
       3R 11024410 C T B6 1 45 
       3R 11024410 C T B7 0 66 
       3R 11024410 C T AB8 0 58", header = TRUE) 

tmp<-c(1,1,0,1,1,1,1,1,1,1,1,1,0,0,0) 

Теперь использовать целочисленное деление, чтобы определить блоки, а затем использовать aggregate или функции вашего выбора «применить-скомбинировать раскол»:

aggregate(x$V6, list(block = (seq_len(nrow(x)) - 1) %/% 15), FUN = function(v) all(v == tmp)) 
# block  x 
#1  0 FALSE 
#2  1 FALSE 

, вероятно, быстрее альтернативы можно было бы преобразовать столбец вашего data.frame в матрицу и сделать это:

colSums(matrix(x$V6, nrow = 15) == tmp) == 15L 
#[1] FALSE FALSE 
+0

Привет, Роланд, это отличный способ сделать то, что я прошу, чтобы я даже не подумал. Как насчет шлюза? Я спрашиваю, потому что это беспокоит меня, я не мог изобразить шлюпку. – Genetics

+0

Я не понимаю, что вы там делаете с 'print' и' match', но основная идея заключается в том, что вам нужно рассчитать индексы, то есть 'i + 0: 14'. – Roland

+0

Привет, Роланд, я не очень полезен для агрегатной функции. Если вы найдете совпадение, есть ли простой способ отменить курс и вытащить совпадение в кадре данных? – Genetics