2014-07-05 3 views
0

Я пытаюсь скопировать данные из одного фрейма данных в другой фрейм данных, используя strtrim в цикле.Обрезка и заполнение кадра данных в цикле

df <- data.frame(a = c("NEW0057-1", "NEW0058-2", "NEW0059-3", "NEW0060-4")) 
trunc <- data.frame(matrix(nrow=nrow(df), ncol=1)) 
names(trunc) <- "b" 

for (i in nrow(df)){   
     trunc[i,] <- strtrim(df[i,], 7)    
} 

head(trunc) 

Над дает:

 b 
1 <NA> 
2 <NA> 
3 <NA> 
4 NEW0060 

Однако я ищу следующий результат:

 b 
1 NEW0057 
2 NEW0058 
3 NEW0059 
4 NEW0060 

thread here говорит, что предварительное выделение кадра данных не рекомендуется. Я думаю, что это больше для эффективности и не должно вызывать тип результата, который я получаю выше. В любом случае я попытался использовать список в качестве предложения и получил аналогичный результат:

df <- data.frame(a = c("NEW0057-1", "NEW0058-2", "NEW0059-3", "NEW0060-4")) 
trunc <- list() 
for (i in nrow(df)){ 
     trunc[[i]] <- strtrim(df[i,], 7) 
} 
df = do.call("rbind", trunc) 

Я ценю ваше время.

R версия 3.0.3

+2

Я не понимаю, почему вы используете петлю на всех здесь. 'strtrim (df $ a, 7)' должен обрезать все значения сразу. Если вы хотите создать новый data.frame из этого, используйте 'trunc <- data.frame (b = strtrim (df $ a, 7))' – MrFlick

+2

Попробуйте 'for (i in 1: nrow (df))'. Вам не хватает части «1:». Тем не менее, @MrFlick прав. – Jota

+0

Вы оба очень правы! Я скучаю по этому. Спасибо за указатель. – sedeh

ответ

0

Как уже упоминалось в комментариях, нет необходимости в цикле здесь.

Кроме того, это, кажется, как хороший случай, когда within можно использовать

> (trunc <- within(df, { b <- strtrim(a, 7); rm(a) })) 
#   b 
# 1 NEW0057 
# 2 NEW0058 
# 3 NEW0059 
# 4 NEW0060 
Смежные вопросы