2016-03-10 3 views
2

Я хочу вычесть каждый последующий столбец со значениями из предыдущего столбца.Вычтите два столбца с NA на несколько столбцов

Список

A B C D E 
1 2 3 4 6 
2 2 2 3 NA 
3 4 5 NA NA 
1 NA NA 2 4 

Результат

1 1 1 2 
0 0 1 NA 
1 1 NA NA 
NA NA NA 2 

я могу сделать это с помощью колонки связывающей всех результатов as.matrix((ifelse(!is.na(List[,1])&!is.na(List[,2], List[,2]-List[,1], "NA"))) по столбцам, но это кажется ужасно утомительно.

  1. Есть ли более быстрый способ?

  2. В случае последней полосы в List, как я могу получить значение разницы между двумя значениями (столбец D - столбец A), разделенный интервалами между ними (3 интервала)? Таким образом, вместо Result, мы имеем:

Alt_result

1 1 1 2 
0 0 1 NA 
1 1 NA NA 
NA NA 0.333 2 
+0

Что вы подразумеваете под 'последней lane'? – akrun

+0

Последняя строка 'List', мы имеем c (1, NA, NA, 2,4). В пункте 2 можно было бы изменить код таким образом, чтобы он делит разницу между двумя столбцами на расстояние между двумя значениями, отличными от NA? – Turtle

+0

Извините, мне это непонятно. Почему вы меняете только одну ячейку, то есть с 0,33? – akrun

ответ

2

Мы подмножество набора данных путем удаления последнего столбца [-ncol(d1)] и первый один [-1] и вычитать эти одинакового размера наборов данных, так что каждый столбец будет вычтено по предыдущим.

abs(d1[-ncol(d1)]- d1[-1]) 
# A B C D 
#1 1 1 1 2 
#2 0 0 1 NA 
#3 1 1 NA NA 
#4 NA NA NA 2 
2

Это может быть сделано путем применения diff функции строки мудрая

t(apply(df,1,diff)) 
#  B C D E 
#[1,] 1 1 1 2 
#[2,] 0 0 1 NA 
#[3,] 1 1 NA NA 
#[4,] NA NA NA 2 
Смежные вопросы