Преобразуйте data.frame столбцы от факторов до символов

Ну, во-первых, лично я не имел бы идентичных элементов (с точки зрения HTML) на одной странице, если бы мог контролировать это. Но чтобы ваш элемент отображался в HTML, должно работать следующее: (Я пишу Javascript из-за вашего тега транспортира, я предполагаю, что так написаны ваши тесты)

buttons = driver.findElements(By.xpath("//button"))
buttons[1].click();

Однако, если вы хотите найти его по имени (для любого случая использования), который вы могли бы сделать

buttonWithText1 = driver.findElement(By.xpath("//td[text()[contains(., 'test1')]]/following-sibling::td/button");
buttonWithText1.click();

Поскольку @Sers указывает ниже, xpath //td[.='test1']/following-sibling::td/button также работает и является самым чистым. Или самое короткое, по крайней мере.

Если вы хотите динамически использовать этот xpath для поиска кнопок по этому тексту, вы можете использовать:

var myText = "test1"
driver.findElement(By.xpath("//td[.='" + myText + "']/following-sibling::td/button).click()

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

пользователь сказал, что он не хочет использовать xpath. Основываясь на HTML, вы можете использовать селектор CSS, как этот, чтобы выбрать кнопку рядом с какой-нибудь строкой myText.

var buttons = browser.findElements(By.css(‘button.ng-binding’))
var tds = browser.findElements(By.css(‘td.ng-binding’))
for (i = 0; i < tds.length; i++) {
    if (tds[i].getText()==myText) {
        buttons[i].click()
        break;
    }
}
329
задан GSee 10 January 2013 в 11:26
поделиться

8 ответов

Просто слежу за Мэттом и Дирком. Если вы хотите воссоздать существующий фрейм данных без изменения глобального параметра, вы можете воссоздать его с помощью оператора apply:

bob <- data.frame(lapply(bob, as.character), stringsAsFactors=FALSE)

Это преобразует все переменные в класс "character", если вы хотите преобразовать только коэффициенты, см. Решение Марека ниже .

Как отмечает @hadley, следующее более лаконично.

bob[] <- lapply(bob, as.character)

В обоих случаях lapply выводит список; однако из-за магических свойств R использование [] во втором случае сохраняет класс data.frame объекта bob , тем самым устраняя необходимость преобразования обратно в data.frame с использованием as.data.frame с аргументом stringsAsFactors = FALSE .

345
ответ дан 23 November 2019 в 00:46
поделиться

Это работает, преобразовывая все к символу и затем числовому к числовому:

makenumcols<-function(df){
  df<-as.data.frame(df)
  df[] <- lapply(df, as.character)
  cond <- apply(df, 2, function(x) {
    x <- x[!is.na(x)]
    all(suppressWarnings(!is.na(as.numeric(x))))
  })
  numeric_cols <- names(df)[cond]
  df[,numeric_cols] <- sapply(df[,numeric_cols], as.numeric)
  return(df)
}

Адаптированный от: Добираются, типы столбца Excel покрывают автоматически

0
ответ дан 23 November 2019 в 00:46
поделиться

Возможно, более новая опция?

library("tidyverse")

bob <- bob %>% group_by_if(is.factor, as.character)
2
ответ дан 23 November 2019 в 00:46
поделиться

Или вы можете попробовать преобразовать :

newbob <- transform(bob, phenotype = as.character(phenotype))

Просто не забудьте указать каждый коэффициент, который вы хотите преобразовать в символ.

Или вы можете сделать что-то вроде этого и убить всех вредителей одним ударом:

newbob_char <- as.data.frame(lapply(bob[sapply(bob, is.factor)], as.character), stringsAsFactors = FALSE)
newbob_rest <- bob[!(sapply(bob, is.factor))]
newbob <- cbind(newbob_char, newbob_rest)

Пихать данные в такой код не хорошая идея, я мог бы сделать sapply отдельно (на самом деле, это намного проще сделать так), но вы поняли ... Я не проверял код, потому что меня нет дома, поэтому я надеюсь, что это сработает! =)

У этого подхода, однако, есть обратная сторона ... вы должны впоследствии реорганизовать столбцы, а с преобразованием вы можете делать все, что захотите, но за "пешеходный стиль- написание кода " ...

Так вот ... =)

7
ответ дан 23 November 2019 в 00:46
поделиться

Обновление: вот пример того, что не работает. Я думал, что будет, но я думаю, что опция stringsAsFactors работает только с символьными строками - она ​​оставляет факторы в покое.

Попробуйте следующее:

bob2 <- data.frame(bob, stringsAsFactors = FALSE)

Вообще говоря, всякий раз, когда у вас возникают проблемы с факторами, которые должны быть символами, существует параметр stringsAsFactors , который может вам помочь (включая глобальный параметр).

7
ответ дан 23 November 2019 в 00:46
поделиться

Другой способ - преобразовать его с помощью apply

bob2 <- apply(bob,2,as.character)

И лучший (предыдущий относится к классу 'matrix')

bob2 <- as.data.frame(as.matrix(bob),stringsAsFactors=F)
8
ответ дан 23 November 2019 в 00:46
поделиться

Глобальный параметр

stringsAsFactors: Настройка по умолчанию для аргументов data.frame и read.table.

может быть чем-то, что вы хотите установить на FALSE в ваших файлах запуска (например, ~ / .Rprofile). См. справку (параметры) .

39
ответ дан 23 November 2019 в 00:46
поделиться

Для замены только факторов:

i <- sapply(bob, is.factor)
bob[i] <- lapply(bob[i], as.character)

В пакете dplyr в версии 0.5.0 была введена новая функция mutate_if :

library(dplyr)
bob %>% mutate_if(is.factor, as.character) -> bob

Пакет purrr из RStudio дает другую альтернативу :

library(purrr)
library(dplyr)
bob %>% map_if(is.factor, as.character) %>% as_tibble -> bob
290
ответ дан 23 November 2019 в 00:46
поделиться
Другие вопросы по тегам:

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