2016-10-12 58 views
1

例如,讓我們用字符串由以下數據幀的每一個元素:R:將函數應用於一個數據幀

df <- data.frame(X = LETTERS[1:3], Y = LETTERS[4:6], row.names = c("r1", "r2", "r3"), stringsAsFactors = F) 

> df 
    X Y 
r1 A D 
r2 B E 
r3 C F 

現在,我想這一功能應用到數據幀中的每個元素:

my_f <- function(x) paste0(x, x) 

這應該產生這樣的結果:

>df 
    X Y 
r1 AA DD 
r2 BB EE 
r3 CC FF 

我一直在使用嵌套的for循環:

for (i in 1:dim(df)[1]) { 
    for (j in 1:dim(df)[2]) { 
     df[i, j] = my_f(df[i, j]) 
    } 
} 

我不知道是否有一個更短/更快的方式來實現相同的結果嗎?請注意,輸出必須是具有相同行和列名稱的數據框。

回答

5

我們可以使用strrep通過使用lapply循環遍歷數據集的列。 []將恢復相同的'data.frame'結構。

df[] <- lapply(df, strrep,2) 
df 
# X Y 
#r1 AA DD 
#r2 BB EE 
#r3 CC FF 
+0

的op'f自定義函數也工作在這裏 – agenis

+0

@agenis是的,我想'strrep'應該更快速 – akrun

+0

心靈解釋之間''df'and DF的區別[] '?如果我使用'df [] < - apply(df,2,my_f)'它可以工作,但沒有'[]'會丟失rownames。 – Haboryme

2

你已經有了答案。

您可以apply你的函數my_f每個元素橫行(margin = 1

data.frame(t(apply(df, 1,my_f))) 

# X1 X2 
#r1 AA DD 
#r2 BB EE 
#r3 CC FF 

正如@ m0h3n建議,您可以通過應用功能逐列(margin=2

避免 t ranspose步
data.frame(apply(df, 2,my_f)) 
+1

如果您使用「margin = 2」,則不需要轉置。 – 989

+0

@ m0h3n yup..was只是編輯。謝謝。 –

+1

只是一個旁註,只有這個解決方案不需要'df [] <-'賦值來產生'data.frame',也就是說你可以做'new_df < - apply(df,2,my_f)'。 –

4

這裏是一個沒有任何應用功能的解決方案:

df[] <- my_f(as.matrix(df)) 
1

使用for循環

for(i in 1:nrow(df)){ 
    df$X[i] <- paste0(df$X[i],df$X[i],collapse = "") 
    df$Y[i] <- paste0(df$Y[i],df$Y[i],collapse = "") 
} 

print(df) 

    X Y 
r1 AA DD 
r2 BB EE 
r3 CC FF 
相關問題