2014-11-15 5 views
1

Я обрабатываю экземпляр data.table и, глядя, чтобы создать дополнительный столбец, используя :=, это работало нормально, пока я не сделал двойную индексацию.создание столбца data.table с `: =` и двойным индексированием

Для следующего экземпляра data.table:

example_data= structure(list(V1 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,1L, 1L), 
          .Label = c("AUDUSD", "EURUSD", "GBPUSD", "NZDUSD", "USDCAD","USDJPY"), class = "factor"), 
          V2 = structure(c(1L, 1L, 1L, 1L,1L, 1L, 1L, 1L, 1L, 1L), 
           .Label = c("2007", "2008", "2009", "2010", "2011", "2012", "2013", "2014"), 
          class = "factor"), 
          V3 = c("1.RData", "10.RData", "11.RData", "12.RData", "2.RData", "3.RData", "4.RData", "5.RData", "6.RData", "7.RData")), 
         .Names = c("V1", "V2", "V3"), 
         class = c("data.table", "data.frame"), row.names = c(NA, -10L)) 

, который дает эти данные:

example_data V1 V2 V3 1: AUDUSD 2007 1.RData 2: AUDUSD 2007 10.RData 3: AUDUSD 2007 11.RData 4: AUDUSD 2007 12.RData 5: AUDUSD 2007 2.RData 6: AUDUSD 2007 3.RData 7: AUDUSD 2007 4.RData 8: AUDUSD 2007 5.RData 9: AUDUSD 2007 6.RData 10: AUDUSD 2007 7.RData

Ищу разделить колонку "V3" на "" и получить предыдущее число как символ в новом столбце в той же таблице.

Делать это очень просто в нормальном R:

example_data$MONTH = apply(example_data,1, function(x) { strsplit(as.character(x[["V3"]]),"\\.")[[1]][1]})

Я думал, что делает это в data.table будет еще более простым:

example_data[,MONTH:=strsplit(as.character(V3),"\\.")[[1]][1]]

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

example_data[,strsplit(as.character(V3),"\\.")]

Я также попытался усваивают индексации путем применения функции, но есть к тому же неправильно результат:

myfunc <- function(x) { strsplit(as.character(x),"\\.")[[1]][1] } example_data[,MONTH:=myfunc(V3)]

Я всегда могу использовать стандартное решение R, но если кто-нибудь знает решение, основанное data.table, который будет оценен. Меня не интересуют другие стандартные R или альтернативы (они великолепны - просто не то, что я прошу).

+0

Чтобы получить первый элемент каждого списка, вам понадобится тот же 'apply' (или лучше' sapply'). Но мы должны обеспечить функцию, чтобы сделать это удобно. Не могли бы вы указать проблему [здесь] (http://github.com/Rdatatable/data.table/issues)? – Arun

+0

Я буду, 'data.table' намного быстрее, чем некоторые другие варианты, это стоит кривая обучения синтаксису. –

ответ

3

Вы должны использовать sub вместо strsplit:

example_data[ , MONTH := sub("\\..*", "", V3)] 

     V1 V2  V3 MONTH 
1: AUDUSD 2007 1.RData  1 
2: AUDUSD 2007 10.RData 10 
3: AUDUSD 2007 11.RData 11 
4: AUDUSD 2007 12.RData 12 
5: AUDUSD 2007 2.RData  2 
6: AUDUSD 2007 3.RData  3 
7: AUDUSD 2007 4.RData  4 
8: AUDUSD 2007 5.RData  5 
9: AUDUSD 2007 6.RData  6 
10: AUDUSD 2007 7.RData  7 

Однако, он работает с strsplit тоже:

example_data[ , MONTH := unlist(strsplit(V3, "\\..*"))] 
+0

Это работает и имеет смысл. Благодаря! –

+1

Свен, это здорово! Но обратите внимание, что 'strsplit()' возвращает список. Возможно, вам придется «unlist()». – Arun

+1

@Arun Согласен. Я добавил 'unlist'. –

1

Просто сдвинуты две функции transpose() и tstrsplit() в data.table v1 .9.5.

С этим мы можем сделать:

require(data.table) 
setDT(example_data)[, col := tstrsplit(V3, ".", fixed=TRUE)[[1L]]] 
#   V1 V2  V3 col 
# 1: AUDUSD 2007 1.RData 1 
# 2: AUDUSD 2007 10.RData 10 
# 3: AUDUSD 2007 11.RData 11 
# 4: AUDUSD 2007 12.RData 12 
# 5: AUDUSD 2007 2.RData 2 
# 6: AUDUSD 2007 3.RData 3 
# 7: AUDUSD 2007 4.RData 4 
# 8: AUDUSD 2007 5.RData 5 
# 9: AUDUSD 2007 6.RData 6 
# 10: AUDUSD 2007 7.RData 7 

tstrsplit является оболочкой для transpose(strsplit(...)). transpose() также могут использоваться на перечни, кадры данных и таблицы данных. Дополнительную информацию см. В документации и примерах.

+1

Теперь это сервис для вас - спасибо - он очень ценится. –

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