Как я могу применить функцию к столбцу фрейма данных, используя lapply? - PullRequest
0 голосов
/ 13 января 2012

Как мне переписать цикл for в следующем фрагменте кода, используя lapply?

transactions <- read.table(file = file("stdin"), header = FALSE, stringsAsFactors = FALSE)
for (i in 1:nrow(transactions)) {
  transactions[i,1] <- paste(sort(unlist(strsplit(transactions[i,1], ","))), collapse = ",")
}

Если вам проще работать с некоторыми входными данными, используйте в качестве содержимого стандартного ввода следующее:

a,b
b,c,a
a,b,c
b,a,c
a,b,c,d
a,d,b,c

Ответы [ 3 ]

2 голосов
/ 13 января 2012
# Sample data
n <- 10
d <- data.frame(
  a = unlist( lapply( 
    1:n, 
    function (u) { paste( sample(LETTERS, 5), collapse="," ) } 
  )),
  b = 1:n,
  stringsAsFactors = FALSE
)

# Sort the lists
d[,1] <- unlist(lapply( 
  strsplit(d[,1], ","), # List with the data to process
  function (u) { paste(sort(u), collapse=",") } # Function to apply to each element
))
1 голос
/ 13 января 2012

Похоже, вы хотите отсортировать отдельные компоненты через запятую transactions[, 1].

transactions[, 1] <- sapply(lapply(strsplit(transactions[, 1], ","),
                                   sort),
                            paste, collapse=",")
1 голос
/ 13 января 2012

Если я правильно понимаю ваш код, вы хотите заменить значения в столбце 1 транзакций их новыми значениями.

Поскольку вы использовали header = FALSE, я предполагаю, что имя столбца 1 - V1. В этом случае вам не нужен ни цикл, ни lapply (), поскольку операция может быть векторизована так:

transactions$V1 <- paste(sort(unlist(strsplit(transactions$V1, ","))),
                         collapse = ",")

РЕДАКТИРОВАТЬ: Я понятия не имею, работает ли вставка / сортировка / unlist / strsplit, так как я не вижу исходные данные. Я хочу сказать, что вам не нужны циклы или применение для преобразования столбца фрейма данных.

РЕДАКТИРОВАТЬ: ОК, я понимаю, что код должен делать сейчас, и да, выше не будет работать из-за unlist (). Но я уверен, что есть векторизованное решение ... будет редактировать, если я найду его.

РЕДАКТИРОВАТЬ: Справа: лучшее, что я могу придумать, это двойное саппли (). Один для разделения и сортировки транзакций $ V1, другой для вставки его вместе. Это ужасно. Вот оно:

transactions$V1 <- sapply(sapply(strsplit(transactions$V1, ","), sort), 
                          function(x) paste(x, collapse = ","))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...