2013-04-11 3 views
0

У меня есть набор данных (в кадре данных). Я использую apply, чтобы добавить новый столбец в набор данных, в котором строки нового столбца выполняют функцию, используя элементы из других столбцов внутри этой строки. Примените работы, но после того, как она применила эту функцию к каждой строке, она выходит за пределы диапазона и просто продолжает применять значения снова и снова.R Программирование - запретить «применять» от повторяющихся результатов в пределах диапазона данных

Вот данные я начинаю с:

Abbreviation Name X Y Z  A B C 
JM    Jim  3 4 5  6 7 8 
JS    Jess 5 6 7  8 9 10 

Используя следующую команду, я получаю следующие результаты: Команда:

df_new$Test <- apply(df_new,1, function(row) (df_new[,8]/df_new[,6])/(df_new[,5]/df_new[,3])) 

возвращаемые данные (из View (df_new))

Abbreviation Name X Y Z  A B C  Test 
JM    Jim  3 4 5  6 7 8  .8 
JS    Jess 5 6 7  8 9 10 .89 
                 .8 
                 .89 
                 .8 
                 .89 

Кроме того, когда я пишу эти данные в csv, используя приведенную ниже команду, я получаю Следующий вывод: Команда:

write.csv (df_new, файл = "Df_new.csv", row.names = FALSE)

Abbreviation Name X Y Z  A B C  Test Test.1 Test.2 Test.3 
JM    Jim  3 4 5  6 7 8  .8 .8  .8  .8 
JS    Jess 5 6 7  8 9 10 .89 .89  .89  .89 

В идеале, из сказанного выше, я просто хочу df_new [1: 2,1: 9]; однако даже попытка создать объект, который сохраняет только эту информацию, все равно приводит к дополнительным строкам (в представлении (df_new)) или дополнительным столбцам (при записи на .csv).

+0

Не могли бы вы опубликовать результаты 'dput (df_new)', чтобы сделать это воспроизводимая? –

+0

@DavidRobinson данные опубликованы в вопрос? Просто используйте 'read.table (text =" copy/paste here ", h = T)' –

+0

@DavidRobinson, вот что я получаю от dput, хотя решение Dason действительно работает для меня. > dput (df_new) Структура (список (аббревиатура = структура (1: 2, .Label = c ("JM", "JS"), class = "factor"), Name = structure (c (2L, 1L), .Label = c ("Jess", "Jim"), class = "factor"), X = c (3, 5), Y = c (4, 6), Z = c (5, 7), A = c (6, 8), B = c (7, 9), C = c (8, 10), Test = структура (c (0,8, 0,892857142857143, 0,8, 0,892857142857143), Dim = c (2L, 2L), .Dimnames = list ( NULL, c («1», «2»)))), .Names = c («Аббревиатура», «Имя», «X», «Y», «Z», «A», «B», «C», «Test»), row.names = 1: 2, class = «data.frame») –

ответ

3

Обратите внимание, что вы предоставляете функцию apply, которая принимает параметр «строка», но вы никогда не используете его в функции. Я также не понимаю, почему вы должны использовать применять, как я думаю, что

df_new$Test <- (df_new[,8]/df_new[,6])/(df_new[,5]/df_new[,3]) 

должен дать вам то, что вы хотите

+0

Это замечательно, спасибо! –

1

В этом случае вам не нужно использовать apply. Воспользуйтесь тем, что R является vectorised и просто сделать:

df_new$Test <- (df_new$C/df_new$A)/(df_new$Z/df_new$X) 
# Abbreviation Name X Y Z A B C  Test 
# 1   JM Jim 3 4 5 6 7 8 0.8000000 
# 2   JS Jess 5 6 7 8 9 10 0.8928571 

R будет рассматривать каждый столбец в сумме в качестве вектора и работать на них поэлементно. Он использует первый элемент из всех векторов, чтобы вернуть первое значение, затем второй элемент из всех векторов, чтобы вернуть второе значение, а затем нет никаких элементов в любых векторах, поэтому возвращает вектор из двух чисел.

+0

Спасибо, Саймон. Это действительно помогает мне понять применение «$». Слева от назначения, $ после того, как dataframe создает новый столбец.Справа я могу использовать $ для определения столбца, представляющего интерес для использования в вычислениях. Очень полезно знать! спасибо. –