2016-10-12 4 views
1

Например, позволяет использовать следующую dataframe, состоящую из строк:R: Применяя функцию к каждому элементу dataframe

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 

Теперь я хотел бы применить эту функцию к каждому элементу dataframe:

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

Который должен произвести этот результат:

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

Я использую вложенным для петель:

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 [] <- apply (df, 2, my_f)', он работает, но без '[]' он теряет имена розеров. – 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 предложил, вы можете избежать t ranspose шаг, применяя функцию столбцам (margin=2)

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(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 
Смежные вопросы