2015-12-05 3 views
-1

Я новичок в программировании R. Я хочу добавить две последовательные строки первого столбца в таблице. Вот функция, которую я пробовал:Как добавить две последовательные строки в таблицу в программировании r

x <- airquality[ , 1] 
fun <- function(x){ 
for (i in 1: length(x)) 
y <- sum(x[i,1], x[i+1, 1]) 
y 
} 

У меня нет отображения.

Пожалуйста, дайте мне знать мои ошибки. Благодаря

+0

Я попытался бы выполнить ваш код, прежде чем усложнять ситуацию, обернув его функцией. Подсказки: 1) посмотрите на 'dim (x)' его NULL, поскольку он является вектором. Внутри вашего цикла вы индексируете его так, как если бы он имел строки и столбцы, поэтому используйте 'x [i]' и т. Д. (Или используйте ' x <- airquality [, 1, drop = FALSE] 'при создании, чтобы сохранить его размерность) 2) Yuo не индексировал выходной вектор' y', поэтому он будет хранить только последнее значение, а не все. Попробуйте 'y [i]'. 3) Перед циклом вам нужно указать 'y' ...' y <- numeric (length (x)) '4)' x [i + 1] 'не существует для' i = length (x) ' – user20650

+1

Многие вычисления в R могут быть векторизованы, поэтому нет необходимости в циклах. Вы можете сделать это же вычисление с помощью 'tail (x, -1) + head (x, -1)' – user20650

+0

Ошибки возникают из-за того, что x больше не является матрицей или data.frame, поэтому использование функции индексирования с двумя значениями не выполняется. Используйте 'x [i]' и 'x [i + 1' или, как упоминалось, научитесь использовать векторные функции R. –

ответ

1

Несколько вещей, которые я заметил:

  1. Убедитесь, что вы запустите функцию (вы объявили его здесь, но не запускать)
  2. Вы экономия по переменной у каждый раз, когда цикл работает. В этом случае ваш результат будет суммой последних двух строк (я не думаю, что это то, что вы хотите).
  3. x - это вектор, а не кадр данных, поскольку вы выбрали только первый столбец. Таким образом, x [i, 1] создаст ошибку, так как x одномерна. x [i] - это то, что вы хотите.

Вот как вы можете это сделать:

x <- airquality[ , 1] 

# Declare your function 
fun <- function(x){ 
    y <- numeric() 
    for (i in 1:(length(x)-1)){ 
     y <- c(y, sum(x[i], x[i+1])) # Add to y with each loop cycle 
    } 
    y 
} 

# Run your function: 
fun(x) 

Примечание: существуют более эффективные способы сделать это в R, но похоже, что вы могли бы быть более удобным в стиле C++ зацикливание. Но, думаю, лучше, чем идеальный.

редактировать: форматирование

+0

Спасибо за ваш ответ. К сожалению, он не работает. Я попробовал rollapply, и он отлично работает с этим, но я хочу использовать свою собственную функцию. Я думаю, проблема заключается в том, что набор данных airquality - это кадр данных, и я думаю, что это создает проблему. – Rath

1

Я думаю, что это делает то, что вам нужно:

x + c(x[-1], 0) 

x[-1] является й без первого элемента. 0 на конце делает два вектора одинаковой длины, чтобы их можно было добавить.

Смежные вопросы