Как добавить столбец во фрейм данных внутри функции - PullRequest
9 голосов
/ 15 июня 2011

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

Я был бы признателен за образец кода, чтобы сделать это ...

Ответы [ 2 ]

7 голосов
/ 15 июня 2011

Я предполагаю, что речь идет о R ... R не передает аргументы по ссылке (окружение и ссылочные классы (S5) являются исключением, но это вне текущего диапазона абстракции).Таким образом, когда вы пишете

addThree<-function(x){
 x<-x+3
}
4->y
addThree(y)

y по-прежнему 4 в конце кода, потому что внутри функции, x является свежей копией значения y s, а не yсама по себе (опять же, не совсем, но это детали более высокого порядка).

Таким образом, вы должны адаптироваться к схеме передачи по копированию R и вернуть измененное значение и присвоить его обратно вашей переменной (используя старую формулировку, в R нет процедур:

addThree<-function(x){
 return(x+3)
}
4->y
addThree(y)->y
#y is now 7

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

BTW,вы можете опустить return, если хотите вернуть последнее значение, созданное в функции, т.е. определение addThree может выглядеть так:

addThree<-function(x) x+3
1 голос
/ 14 сентября 2016

лучший подход - использовать mutate() из библиотеки dplyr.Пример:

addcol = function(dat){
    dat1 = mutate(dat, x2=x1*2)
    return(dat1)
}

dat - это фрейм данных со столбцом с именем «x1».Используйте эту функцию addcol(), новый набор данных теперь имеет новый столбец с именем "x2", который в два раза больше значения "x1", предполагая, что x1 является числовым.

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