Динамическое объединение имени столбца и значений кадра данных с использованием функций lapply или apply или mapply - PullRequest
0 голосов
/ 25 марта 2020

У меня есть foo_dataframe (см. Ниже), который я хочу преобразовать в данные транзакции:

foo_dataframe <- data.frame(replicate(50,1:4))
foo_dataframe 
#  X1 X2 X3 X4 X5 X6 X7 X8 X9...................X50
#1  1  1  1  1  1  1  1  1  1
#2  2  2  2  2  2  2  2  2  2
#3  3  3  3  3  3  3  3  3  3
#4  4  4  4  4  4  4  4  4  4

Ожидаемые данные транзакции находятся ниже (т.е. данные транзакции должны быть конкатенацией столбца имя и каждое значение фрейма данных):

#   X1    X2    X3    X4 ................X50
#1 X1 1  X2 1  X3 1  X4 1               X50 1 
#2 X1 2  X2 2  X3 2  X4 2               X50 2
#3 X1 3  X2 3  X3 3  X4 3               X50 3 
#4 X1 4  X2 4  X3 4  X4 4               X50 4 

Я могу объединить каждый столбец и его значения с помощью этого кода:

m <- paste(colnames(foo_dataframe)[1], foo_dataframe[[1]], "")
n <- paste(colnames(foo_dataframe)[2], foo_dataframe[[2]], "")
o <- paste(colnames(foo_dataframe)[3], foo_dataframe[[3]], "")
p <- paste(colnames(foo_dataframe)[4], foo_dataframe[[4]], "")

И позже соединить их, используя data.frame(m,n,o,p), чтобы получить:

#   X1    X2    X3    X4
#1 X1 1  X2 1  X3 1  X4 1 
#2 X1 2  X2 2  X3 2  X4 2 
#3 X1 3  X2 3  X3 3  X4 3 
#4 X1 4  X2 4  X3 4  X4 4

Чтобы сэкономить время, я думаю, что это можно сделать динамически с помощью функций применения, поскольку у меня есть много столбцов, которые нужно сделать. Тем не менее, когда я попытался применить функцию, с кодом ниже:

c <- 1:length(length(colnames(foo_dataframe)))
t <- foo_dataframe
transactionData <- function(t, c){ # t = dataframe; c = column no.
  paste(colnames(t)[c], t[[c]], "")
}
foo_transactionData <- lapply(t, transactionData, c)

я получил следующую ошибку:

Error in t[[c]] : attempt to select more than one element in vectorIndex

Я трудоемкий стекопоток, чтобы найти решение, но не нашел ни одного , Любая помощь будет оценена. Спасибо.

1 Ответ

2 голосов
/ 25 марта 2020

Мы можем использовать Map:

foo_dataframe[] <- Map(paste, names(foo_dataframe), foo_dataframe)

foo_dataframe[, 1:4]

#    X1   X2   X3   X4
#1 X1 1 X2 1 X3 1 X4 1
#2 X1 2 X2 2 X3 2 X4 2
#3 X1 3 X2 3 X3 3 X4 3
#4 X1 4 X2 4 X3 4 X4 4

Используя lapply, мы можем l oop по индексу столбцов или их имен

foo_dataframe[] <- lapply(names(foo_dataframe), function(x) 
                   paste(x, foo_dataframe[[x]]))

Эквивалентные опции, использующие purrr:

library(purrr)
imap_dfc(foo_dataframe, ~paste(.y, .x))
map2_dfc(foo_dataframe, names(foo_dataframe), ~paste(.y, .x))
map_dfc(names(foo_dataframe), ~paste(.x, foo_dataframe[[.x]]))

РЕДАКТИРОВАТЬ

Чтобы избежать вставки NA значений, мы можем сделать:

foo_dataframe[] <- Map(function(x, y) ifelse(is.na(y), "",paste(x, y)), 
                       names(foo_dataframe), foo_dataframe)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...