R: Как вы запускаете функцию для получения нескольких столбцов? - PullRequest
0 голосов
/ 02 апреля 2019

Таким образом, мои данные выглядят так:

   id first  middle  last       Age
    1 Carol  Jenny   Smith      15
    2 Sarah  Carol   Roberts    20
    3 Josh   David   Richardson 22

У меня есть функция, которая создает новый столбец, который сообщает вам, сколько раз было найдено имя для каждой строки в предыдущих столбцах, которые я указал (2-4-йстолбцы или «первые»: «последние» столбцы).У меня есть функция, которая выводит результат ниже:

funname <- function(df, cols, value, newcolunmn) {
  df$newcolumn <- as.integer(rowSums(df[cols] == value) > 0)
}
   id first  middle  last       Age  Carol
    1 Carol   Jenny   Smith      15    1
    2 Sarah  Carol   Roberts     20    1
    3 Josh   David   Richardson  22    0

Но мои реальные данные более сложны, и я хочу создать как минимум 20 новых, разных столбцов (например: Кэрол, Роберт, Дженни,Анна, Ричард, Даниэль, Эрик ...) Так как я могу включить несколько новых столбцов в существующую функцию?Я могу думать только о добавлении функции (df, cols, value, newcolumn1, newcolumn2, newcolumn3, ...,), но это было бы невозможно, если бы я хотел, как сто столбцов позже, ... любая помощь?заранее спасибо!:)

РЕДАКТИРОВАТЬ:

 function(df, cols, value, newcol) {

   df$newcol <- as.integer(rowSums(df[cols] == value) > 0)
   df 
}

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

1 Ответ

1 голос
/ 03 апреля 2019

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

tab <- as.data.frame.matrix(table(row(dat[2:4]), unlist(dat[2:4])))
cbind(dat, tab)
#  id first middle       last Age Carol David Jenny Josh Richardson Roberts Sarah Smith
#1  1 Carol  Jenny      Smith  15     1     0     1    0          0       0     0     1
#2  2 Sarah  Carol    Roberts  20     1     0     0    0          0       1     1     0
#3  3  Josh  David Richardson  22     0     1     0    1          1       0     0     0

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

tab <- as.data.frame.matrix(table(row(dat[2:4]), unlist(dat[2:4])))
dat[paste0(colnames(tab),"_n")] <- tab
dat
#  id first middle       last Age Carol_n David_n Jenny_n Josh_n Richardson_n Roberts_n Sarah_n Smith_n
#1  1 Carol  Jenny      Smith  15       1       0       1      0            0         0       0       1
#2  2 Sarah  Carol    Roberts  20       1       0       0      0            0         1       1       0
#3  3  Josh  David Richardson  22       0       1       0      1            1         0       0       0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...