Как и в моем вопросе вчера на reshaping matrices in R, я сейчас пытаюсь изменить кадры данных, чтобы я мог векторизовать свою функцию. В приведенном ниже коде основной функцией является scorecard
. Он принимает в фрейме данных subset.loans
и subset.collateral
. Я задаюсь вопросом, могу ли я изменить два кадра loans
и collaterals
, которые оба выглядят следующим образом:Векторизация списка операций с списками в R
LOANS COLLATERAL
id | value id | value type
---------- -------------------
1 200 1 600 a
2 4390 1 899 b
2 860 2 190 d
2 9750 3 4930 e
3 600 3 300 a
: : : : :
В это:
id | loans collateral
-----------------------------
1 c(200) data.frame(a=c(600,899), b=('a','b'))
2 c(4390,860,9750) data.frame(a=c(190), b=c('d'))
3 c(600) data.frame(a=c(4930,300), b=c('e','a'))
Моя надежда состоит в том, что если я сделаю это, я могу потом используйте одну из функций *apply
- или что-нибудь из инструментария plyr
- просто примените функцию scorecard
по всему предмету. Если есть лучший/более простой способ, пожалуйста, укажите его! Код, который я сейчас использую (с богом забытом for
цикла) следующим образом:
# An Nx2 data frame of loans (ID, amount)
loans <- read.table(...)
# An Mx4 data frame of collaterals to loans (ID, type, value, lien)
collateral <- read.table(...)
# One person (ID) can have >1 loan and >1 collateral, so first just
# find all unique IDs
loans.ID.unique = unique(loans$ID)
# Run an analysis on each ID grouping:
for(n in 1:length(loans.ID.unique)) {
# ...all loans for that ID...
subset.loans <- loans$loans[
which(
loans$scorecard_id == loans.ID.unique[n])]
# ...all collateral for that ID...
subset.collateral <- collateral[
which(
collateral$scorecard_id == loans.ID.unique[n]),
c('type','value','lien')]
# Output scores for each ID
scores[n,1] <- loans.ID.unique[n]
scores[n,c(2,3)] <- scorecard(loans=subset.loans,
collateral=subset.collateral,
}
Спасибо!
Вы должны представить себя в 'plyr' пакет. Шаг 1: используйте 'merge' для объединения ваших данных в один файл data.frame. Шаг 2: используйте 'plyr :: ddply', чтобы выполнить вашу работу за один шаг. – Andrie
@andrie - я загрузил его, но еще не использовал его. (Я только начал использовать R около месяца назад, поэтому у меня есть кое-что, на что нужно обратить внимание.) Если это действительно так просто, как вы говорите, это просто потрясающе. – eykanal
Когда вы начинаете изучать R, у вас всегда есть несколько вещей, на которые нужно смотреть, и чем лучше я получаю с R, я нахожу, что список вещей, на которые нужно смотреть, растет экспоненциально :) –