Примените функцию для каждой строки в соответствии с номером ее столбца. - PullRequest
0 голосов
/ 02 октября 2018

3У меня есть эта функция:

nombre_points<-function(typeAction)
{
  if(typeAction==1)
  {return(4)}
  else if (typeAction==2)
  {return(3)}
  else if (typeAction==3)
  {return(2)}
}

И я хочу применить ее к каждому столбцу фрейма данных

df>
ID 1 2 3
XX 0 1 2
YY 1 2 3
EE 2 2 1 
ZZ 0 3 4

Я хочу применить вышеуказанную функцию к этому фрейму данныхгде входом функции nombre_points является номер столбца.

Таким образом, в результате мне нужно получить для каждой строки кадр данных, подобный этому:

df>

    ID Result
    XX 7
    YY 14
    EE 16
    ZZ 17

Фактически для наблюденияZZ, например, 17=0*4+3*3+4*2 также для XX наблюдений у нас есть оценка: 7=0*4+3*1+2*2

Я пытался использовать apply функцию:

dd<-apply(df,1,nombre_points)

Но это не даетнеобходимый результат

1 Ответ

0 голосов
/ 02 октября 2018

Обновление

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

С таблицей поиска:

named_df <- data.frame(col = c(1, 2, 3), value = c(4, 3, 2))
rowSums(df[-1] * named_df$value[col(df[-1])])
#[1]  7 16 16 17

С именованным вектором:

named_vec <- c("1" = 4, "2" = 3, "3" = 2)
rowSums(named_vec[col(df[-1])] * df[-1])
#[1]  7 16 16 17

Логика для обоих подходов одинакова, мы сопоставляем номер столбца с именемnamed_vec или col из named_df и получите соответствующее значение, а затем умножьте его на фактическое значение в кадре данных, а затем возьмите сумму каждой строки, используя rowSums.

Оригинальный ответ

Вы можете умножить каждое значение в кадре данных на номер его столбца - 1, чтобы получить желаемый результат.Здесь df[-1] означает игнорирование первого столбца (ID).

df$result <- rowSums(df[-1] * (col(df) - 1))
df

#  ID X1 X2 X3 result
#1 XX  0  1  2      5
#2 YY  1  2  3      8
#3 EE  2  2  1      4
#4 ZZ  0  3  4     11

В целях понимания col(df) дает

#     [,1] [,2] [,3] [,4]
#[1,]    1    2    3    4
#[2,]    1    2    3    4
#[3,]    1    2    3    4
#[4,]    1    2    3    4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...