2014-07-05 45 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

嘗試'(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