2017-01-26 1 views
1

Предположим, что я хочу сделать следующее:Выбирают первый не недостающий элемент по строкам

1) Нанести некоторую функцию, которая заменяет не нужны символы, пустые пространства построчно; 2) Затем он выбирает (из исходных данных) строку за строкой первый непустой элемент (в соответствии с приведенным выше преобразованием).

Вот что я сейчас:

library(data.table) 
data<-data.table(x=c("25&&&35&&1","&&&&","&&&&"), 
       y=c("&&&&&","1","&&&&2"), 
       z=c("&&&&&","","1")) 

function_select<-function(x){ 
    x[gsub("&","",x)!=""][1] 
} 

data[,function_select(unlist(.SD)),.SDcols=c("x","y"),by=1:nrow(data)] 

    nrow   V1 
1: 1 25&&&35&&1 
2: 2   1 
3: 3  &&&&2 

У меня есть около 70 миллионов строк, у меня есть два вопроса: 1) Есть ли более быстрый раствор в использовании data.table; 2) Могу ли я ускорить свои вычисления, используя идеи от parLapply;

+1

Вы должны показать ожидаемый результат. Первый символ выбирается через 'substring', а не' [1] ', поэтому, возможно, вы хотите« расплавить »(data [, r: = .I] [, c (« r »,« x »,« y »)] , id = "r") [значение% like% "[^ &]",. (variable = first (variable), char = substring (first (value), 1L, 1L)), by = r] ' – Frank

+0

@ Фрэнк спасибо, я отредактировал вопрос, это первый непустой элемент, который я хочу – Vitalijs

+0

@akrun будет быстрее? Я не вижу большой разницы между вашим и основным ответом. – Vitalijs

ответ

0

Избегайте операций в строке в R, как чума. Здесь я бы, наверное, сделал:

data[, lapply(.SD, sub, pattern = "^&*$", replacement = ""), .SDcols = x:y][ 
    , as.matrix(.SD)[.SD != ""]] 
#[1] "25&&&35&&1" "1"   "&&&&2" 
Смежные вопросы