2016-05-12 3 views
-1

Я пытаюсь понять, как использовать data.tables. Все плохо.Как подмножить таблицу data.table на основе другой таблицы данных?

У меня есть большой data.table с кучей возвратов и AUM. Я подмножал этот data.table в два data.tables, один с возвратами и один с AUM. Теперь я хочу подмножить данные data.table, чтобы получить только доходность средств с AUM меньше 50-го процентиля.

Чтобы дать Вам идею, это мой код:

fundDetails <- data.table(read.table("Fund_Deets.csv", sep = ",", fill = TRUE, quote="\"", header=TRUE)) 
fundNAV <- data.table(read.table("NAV_AUM.csv", sep = ",", fill = TRUE, quote="\"", header=TRUE)) 

allFundDetails <- fundDetails[Currency == 'USD'] 
allFundNAV <- fundNAV[Fund.ID %in% allFundDetails$Fund.ID] 
allFundAUM <- allFundNAV[Type == 'AUM', -c(1,3), with = FALSE] 
allFundAUM <- setnames(data.table(t(sapply(allFundAUM[,-1, with = FALSE],as.numeric))), as.character(allFundAUM$Fund.ID)) 
allFundReturns <- allFundNAV[Type == 'Return', -c(1,3), with = FALSE] 
allFundReturns <- setnames(data.table(t(sapply(allFundReturns[,-1, with = FALSE],as.numeric)/100)), as.character(allFundReturns$Fund.ID)) 
smallFundReturns <- data.table(sapply(allFundReturns, function(x) rep(NA, length(x)))) 

Это Производит следующие три таблицы (smallFundReturns, очевидно, просто NA-х):

> allFundAUM[,1:10, with = FALSE] 
    33992 33261 38102 33264 33275 5606 41695 40483 41526 45993 
    1: NA NA NA NA NA NA NA NA  1 27 
    2: NA NA NA NA NA NA 117 NA  1 27 
    3: NA NA NA NA NA NA 120 NA  1 27 
    4: NA NA NA NA NA NA 133 NA  1 27 
    5: NA NA NA NA NA NA 146 NA  1 29 
---               
260: NA NA NA NA NA NA NA NA NA NA 
261: NA NA NA NA NA NA NA NA NA NA 
262: NA NA NA NA NA NA NA NA NA NA 
263: NA NA NA NA NA NA NA NA NA NA 
264: NA NA NA NA NA NA NA NA NA NA 
> allFundReturns[,1:10, with = FALSE] 
    33992 33261 38102 33264 33275 5606 41695 40483 41526 45993 
    1: NA NA NA NA NA NA  NA NA 0.0188 -0.0116 
    2: NA NA NA NA NA NA -0.0315 NA -0.0120 0.0134 
    3: NA NA NA NA NA NA -0.0978 NA -0.0908 -0.0206 
    4: NA NA NA NA NA NA -0.0445 NA -0.0269 -0.0287 
    5: NA NA NA NA NA NA 0.0139 NA 0.0298 -0.0141 
---                 
260: NA NA NA NA NA NA  NA NA  NA  NA 
261: NA NA NA NA NA NA  NA NA  NA  NA 
262: NA NA NA NA NA NA  NA NA  NA  NA 
263: NA NA NA NA NA NA  NA NA  NA  NA 
264: NA NA NA NA NA NA  NA NA  NA  NA 
> smallFundReturns[,1:10, with = FALSE] 
    33992 33261 38102 33264 33275 5606 41695 40483 41526 45993 
    1: NA NA NA NA NA NA NA NA NA NA 
    2: NA NA NA NA NA NA NA NA NA NA 
    3: NA NA NA NA NA NA NA NA NA NA 
    4: NA NA NA NA NA NA NA NA NA NA 
    5: NA NA NA NA NA NA NA NA NA NA 
---               
260: NA NA NA NA NA NA NA NA NA NA 
261: NA NA NA NA NA NA NA NA NA NA 
262: NA NA NA NA NA NA NA NA NA NA 
263: NA NA NA NA NA NA NA NA NA NA 
264: NA NA NA NA NA NA NA NA NA NA 

for (i in 1:nrow(allFundReturns)){ 
    theSubset <- as.vector(allFundReturns[i,] <= as.numeric(quantile(allFundAUM[i,], .5, na.rm = TRUE))) 
    theSubset[is.na(theSubset)] <- FALSE 
    theSubset <- colnames(allFundReturns)[theSubset] 
    smallFundReturns[i,theSubset, with = FALSE] = allFundReturns[i,theSubset, with = FALSE] 
} 

Я пытаюсь Подмножество с помощью этого для цикла (с использованием петли для петли при попытке отладки):

for (i in 1:nrow(allFundReturns)){ 
    theSubset <- as.vector(allFundReturns[i,] <= as.numeric(quantile(allFundAUM[i,], .5, na.rm = TRUE))) 
    theSubset[is.na(theSubset)] <- FALSE 
    theSubset <- colnames(allFundReturns)[theSubset] 
    smallFundReturns[i,theSubset, with = FALSE] = allFundReturns[i,theSubset, with = FALSE] 
} 

Ошибка:

Error in `[<-.data.table`(`*tmp*`, i, theSubset, with = FALSE, value = list(: 
    unused argument (with = FALSE) 

Я попытался удалить «с» части, но это выкладывает кучу предупреждений:

> warnings() 
Warning messages: 
1: In `[<-.data.table`(`*tmp*`, i, theSubset, value = c("41526", ... : 
    Supplied 3020 items to be assigned to 1 items of column '41526' (3019 unused) 
2: In `[<-.data.table`(`*tmp*`, i, theSubset, value = c("41526", ... : 
    Supplied 3020 items to be assigned to 1 items of column '45993' (3019 unused) 
3: In `[<-.data.table`(`*tmp*`, i, theSubset, value = c("41526", ... : 
    Supplied 3020 items to be assigned to 1 items of column '45994' (3019 unused) 
4: In `[<-.data.table`(`*tmp*`, i, theSubset, value = c("41526", ... : 

Я смущен о том, как это сделать. Любые идеи о том, как я могу подмножить второй data.table подмножеством на первом?

EDIT:

Я попытался ниже предложение:

smallFundReturns[i,(theSubset):=allFundReturns[i,(theSubset), with = FALSE], with = FALSE] 

И я получил эти предупреждения():

> warnings() 
Warning messages: 
1: In `[.data.table`(smallFundReturns, i, `:=`((theSubset), ... : 
    Coerced 'double' RHS to 'logical' to match the column's type; may have truncated precision. Either change the target column to 'double' first (by creating a new 'double' vector length 264 (nrows of entire table) and assign that; i.e. 'replace' column), or coerce RHS to 'logical' (e.g. 1L, NA_[real|integer]_, as.*, etc) to make your intent clear and for speed. Or, set the column type correctly up front when you create the table and stick to it, please. 
2: In `[.data.table`(smallFundReturns, i, `:=`((theSubset), ... : 
    Coerced 'double' RHS to 'logical' to match the column's type; may have truncated precision. Either change the target column to 'double' first (by creating a new 'double' vector length 264 (nrows of entire table) and assign that; i.e. 'replace' column), or coerce RHS to 'logical' (e.g. 1L, NA_[real|integer]_, as.*, etc) to make your intent clear and for speed. Or, set the column type correctly up front when you create the table and stick to it, please. 
3: In `[.data.table`(smallFundReturns, i, `:=`((theSubset), ... : 

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

> smallFundReturns[,1:10, with = FALSE] 
    33992 33261 38102 33264 33275 5606 41695 40483 41526 45993 
    1: NA NA NA NA NA NA NA NA TRUE TRUE 
    2: NA NA NA NA NA NA NA NA NA NA 
    3: NA NA NA NA NA NA NA NA NA NA 
    4: NA NA NA NA NA NA NA NA NA NA 
    5: NA NA NA NA NA NA NA NA NA NA 
---               
260: NA NA NA NA NA NA NA NA NA NA 
261: NA NA NA NA NA NA NA NA NA NA 
262: NA NA NA NA NA NA NA NA NA NA 
263: NA NA NA NA NA NA NA NA NA NA 
264: NA NA NA NA NA NA NA NA NA NA 

EDIT 2:

Я понял вопрос. По-видимому, эта строка:

smallFundReturns <- data.table(sapply(allFundReturns, function(x) rep(NA, length(x)))) 

создал таблицу как логичную. Я изменил его на эту строку:

smallFundReturns <- data.table(sapply(allFundReturns, function(x) as.numeric(rep(NA, length(x))))) 

И все работало после исправления @HubertL. Благодаря!!

ответ

1

Вы должны написать это так:

smallFundReturns[i,(theSubset):=allFundReturns[i,(theSubset), with = FALSE], with = FALSE] 
+0

Это означает, что «ИСТИНА» везде, где я ожидал бы номер. Я очень ценю помощь, но вы могли бы пройти через то, что должно было делать, поэтому я могу узнать, почему «ИСТИНА» появляется вместо возвращения, которое я ожидаю? – lukehawk

+0

Я понял. Благодаря! – lukehawk

+0

уверен, что внешний 'с = F' не нужен – eddi

1

Предложения по улучшению:

чтения Try данные с FREAD вместо read.table, если это возможно. Это намного быстрее, и результатом является data.table, а не data.frame.

Выполнение «data.table операций» с помощью инструкции «, с = FALSE» вы фактически вынуждаете R использовать гораздо более медленные операции data.frame вместо использования невероятно быстрых методов data.table.

Удачи!

+0

Спасибо! Я не знал, что есть функция чтения. Кроме того, знаете ли вы, как я мог бы достичь того же результата без использования? (Я не пытаюсь звучать грубо. Я все еще изучаю пакет data.table.) Или есть лучший способ сделать это все сразу, без использования цикла или функции приложения? Чтобы получить только 25-й процентиль и худшие значения каждого столбца? – lukehawk

Смежные вопросы