#r #csv
#r #csv — файл #csv
Вопрос:
У меня есть data.frame в R, который был создан на основе набора данных примера 1-3 здесь:http://riskfactor.cancer.gov/diet/usualintakes/dataset.html
Я преобразовал его из SAS в ASCII с помощью Stat Transfer, сохранив как csv. Я импортировал данные в R с помощью команды read.csv:
t_0104nc <- read.csv("foo.csv",header=T)
Данные находятся в структуре data.frame. В этом файле есть несколько столбцов, которые относятся к весам (от RNDW до RNDW32). Хотя они кажутся целыми числами, при просмотре данных в Excel ячейки имеют общий формат. R ввел данные как double.
Я использую RNDW1, и мне нужно подтвердить, что это целое число. Однако при вводе typeof(RNDW1) и storage.mode(RNDW1) данные отображаются как двойные.
Какой наиболее эффективный способ для меня проверить, что у меня есть только целочисленные значения в этом столбце? Я не хочу принудительно использовать данные, поскольку наличие нецелых чисел указывало бы на фундаментальную проблему с данными, которую принудительное использование не исправит.
В качестве альтернативы, мне было интересно, есть ли какой-либо способ импортировать данные, чтобы они сохранялись как простейший тип данных в R, который затем должен импортировать эти значения как целое число. Некоторые данные являются целочисленными, другие данные одинарные или двойные, поэтому не все данные одного типа.
Обновите на основе приведенных ниже предложений. Все, что мне нужно, это простой логический тест true / false, поэтому я использовал:
if(isTRUE(all.equal(x, xi <- as.integer(x)))) y="TRUE" else y="FALSE"
y
Который затем возвращает мне единственное значение true или false, чтобы указать общий результат теста. Я ценю все (быстрое!) я получил помощь, и я доволен кодом и своим пониманием этого.
Ответ №1:
all.equal
предоставляет один из способов проверить, все ли значения в столбце имеют целочисленное значение.
Вот функция, которая может делать то, что вам нравится:
careful.as.integer <- function(x) {
if(!is.numeric(x)) return(x) # For factor, character, and logical vectors
if(all.equal(x, as.integer(x))== TRUE) {
as.integer(x)
} else {
x
}
}
DAT <- data.frame(a = c(NA, 1:3),
b = c(1:2, 3.3, NA),
species = c("cat", "dog", "goat", "okapi"))
data.frame(lapply(DAT, careful.as.integer))
# a b species
# 1 NA 1.0 cat
# 2 1 2.0 dog
# 3 2 3.3 goat
# 4 3 NA okapi
Комментарии:
1. чтобы сократить / запутать, вы могли бы использовать
if(isTRUE(all.equal(x, xi <- as.integer(x)) xi else x
(я думаю)2. @BenBolker — На самом деле мне это нравится (с дополнительным
))
в конце). Я думаю, что я сделаюisTRUE
одно из своих новых слов дня.3. @BenBolker … хотя я полагаю, что каждый раз это требует дополнительного шага назначения для
as.integer
преобразования, которого он иногда избегает.4. @Josho’Brien — спасибо за код, поскольку мой набор данных имеет длину 10287 строк, я добавил na.fail (foo $ x) в конец, чтобы посмотреть, не появится ли сообщение об ошибке.
5. @BenBolker — Я получаю сообщение об ошибке с вашим кодом, я попробовал: if(isTrue(all.equal(dataa$REPLICATE_VAR, dataa$ REPLICATE_NEW <- как целое число(dataa $ REPLICATE_VAR)) dataa$REPLICATE_NEW else dataa $ REPLICATE_VAR’ и сообщение об ошибке — Ошибка: неожиданный символ в «if(isTrue(all.equal(dataa $ REPLICATE_VAR, dataa $ REPLICATE_NEW <- как целое число(dataa $ REPLICATE_VAR)) dataa «, извините, не могу понять, как использовать форматирование кода.