Преобразование значений во всех столбцах в одну строку [дубликат]

Очистить и перестроить

. «Чистая» сборки может удалить «мертвую древесину», которая может быть оставлена ​​лежащей рядом с предыдущими сборками, неудачными сборками, неполными сборками и другими проблемами сборки.

В общем случае среда IDE или сборка будет включать в себя некоторую форму «чистой» функции, но это может быть неправильно настроено (например, в ручном файле) или может завершиться неудачей (например, промежуточные или результирующие двоичные файлы - только).

После завершения «очистки» убедитесь, что «чистый» преуспел, и весь сгенерированный промежуточный файл (например, автоматический файл makefile) был успешно удален.

Этот процесс можно рассматривать как конечный вариант, но часто является хорошим первым шагом ; особенно если недавно был добавлен код, связанный с ошибкой (локально или из исходного репозитория).

6
задан A5C1D2H2I1M1N2O1R2T1 12 December 2013 в 08:02
поделиться

3 ответа

Я обнаружил, что преобразование в матрицу сначала облегчает получение уровней.

as.vector(as.matrix(df[,c("alpha", "gamma", "zeta")]))

Конечно, вы могли бы просто сделать stringsAsFactors=FALSE, когда вы сначала прочитали данные.

10
ответ дан Neal Fultz 25 August 2018 в 11:47
поделиться
 vec <- unlist(lapply( df[ , 
                        names(df) %in% c("alpha","gamma", "zeta") ],
                levels) )[1:300]

Это даст уникальные уровни. Если вы хотите получить первые 300 значений в этих столбцах, сделайте следующее:

 vec <- unlist(lapply( df[ , 
                        names(df) %in% c("alpha","gamma", "zeta") ],
                as.character) )[1:300]
0
ответ дан 42- 25 August 2018 в 11:47
поделиться

У вас есть принятый ответ, но вот что я думаю: у вас есть комбинация столбцов factor и character. В этом случае unlist работает не напрямую, но если все они factor или все они character, проблем не будет:

Некоторые примеры данных:

mydf <- data.frame(A = LETTERS[1:3], B = LETTERS[4:6], C = LETTERS[7:9],
                   D = LETTERS[10:12], E = LETTERS[13:15])
df <- mydf
df$E <- as.character(df$E)
colsOfInterest <- c("A", "B", "E")

Случай 1, все столбцы являются факторами

unlist(mydf[colsOfInterest], use.names = FALSE)
# [1] A B C D E F M N O
# Levels: A B C D E F M N O

Случай 2, столбец E = символы, другие факторы столбцов

unlist(df[colsOfInterest], use.names = FALSE)
# [1] "1" "2" "3" "1" "2" "3" "M" "N" "O"

unlist(lapply(df[colsOfInterest], as.character), use.names = FALSE)
# [1] "A" "B" "C" "D" "E" "F" "M" "N" "O"

Для проблема в описанной здесь шкале, тесты показывают, что преобразование в символ сначала и использование unlist на самом деле является самым быстрым подходом, если вы не заботитесь о сохранении факторов. Обратите внимание, что результат fun1() будет неправильным, если некоторые столбцы являются факторами, а некоторые - символами. Вот эталонная отметка в 100 строке data.frame:

library(microbenchmark)    
microbenchmark(fun1(), fun2(), fun3())
# Unit: microseconds
#    expr      min        lq    median       uq      max neval
#  fun1()  572.606  587.3595  595.4845  606.175 3439.055   100
#  fun2()  327.570  334.6265  341.2550  350.449 3443.758   100
#  fun3() 1037.020 1055.6215 1064.1745 1086.197 3929.981   100

Конечно, здесь мы говорим о микросекундах, но масштаб результатов тоже.

Для справки, вот что использовалось для бенчмаркинга. Измените «nRow» и «nCol», если вы хотите протестировать разный размер data.frame, выделяя разные числа столбцов.

nRow <- 100
nCol <- 30
set.seed(1)
mydf <- data.frame(matrix(sample(LETTERS, nRow*nCol, replace = TRUE), nrow = nRow))
colsOfInterest <- sample(nCol, sample(nCol*.7, 1))
length(colsOfInterest)
# [1] 17

library(microbenchmark)    
fun1 <- function() unlist(mydf[colsOfInterest], use.names = FALSE)
fun2 <- function() unlist(lapply(mydf[colsOfInterest], as.character), use.names = FALSE)
fun3 <- function() as.vector(as.matrix(mydf[colsOfInterest]))
microbenchmark(fun1(), fun2(), fun3())
2
ответ дан A5C1D2H2I1M1N2O1R2T1 25 August 2018 в 11:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: