2015-07-03 2 views
0

В пределах кадра данных (назовите его data) у меня есть переменная (назовите ее var), которая принимает такие значения, как «Джон Смит», «Адам Олсон», «Питер Брэдли», и т.д.Разбиение переменной, допускающей числовые столбцы

sapply(data, mode) указывает var является числовым. И когда я делаю as.numeric(var), R выдает числа (1, 2, 3, ... как и ожидалось).

Когда я разделить переменную на две части с помощью stringr::str_split_fixed (как описано в http://rbyexamples.blogspot.com/2015/07/r-for-stata-users-part-3.html Task # 14), и я называю переменные firstname и lastname, R говорит мне, что переменные характер. Следовательно, я не могу использовать as.numeric

Если я правильно прочитал How to convert a data frame column to numeric type?, transform не будет работать. Таким образом, с учетом того, как я разделил var, невозможно преобразовать переменную в числовое.

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

+0

добавить 'as.factor' ? – Cath

+0

Невозможно понять, что вы хотите сделать. Вы начинаете с столбца 'factor', тогда вы используете' strsplit' для получения символов. Затем вы хотите превратить символьные вары в числовые? !! – Frash

+3

Как получить небольшой воспроизводимый пример? –

ответ

1

Я расщепляется "вар" в "FirstName" и "фамилия" следующим образом:

df <- data.frame(var = c("Adam Olson", "John Smith", "Peter Olson")) 
dfFirst <- df 
dfLast <- df 
colnames(dfFirst) <- "firstname" 
colnames(dfLast) <- "lastname" 

L <- levels(df$"var") 

for (n in (1:length(L))) 
{ 
    i <- which(strsplit(L[[n]],"")[[1]]==" ") 
    levels(dfFirst$"firstname")[n] <- substr(L[[n]],1,i[1]-1) 
    levels(dfLast$"lastname")[n] <- substr(L[[n]],i[length(i)]+1,nchar(L[[n]])) 
} 

dfFirstLast <- cbind(dfFirst,dfLast) 

Это очень неэстетический, но переменные остаются числовая:

> as.numeric(dfFirstLast$"firstname") 
[1] 1 2 3 
> as.numeric(dfFirstLast$"lastname") 
[1] 1 2 1 
> as.character(dfFirstLast$"firstname") 
[1] "Adam" "John" "Peter 
> as.character(dfFirstLast$"lastname") 
[1] "Olson" "Smith" "Olson" 
> as.numeric(dfFirstLast$"firstname") + 8 
[1] 9 10 11 
> as.numeric(dfFirstLast$"lastname")/7 
[1] 0.1428571 0.2857143 0.1428571 
+0

Спасибо. Это очень помогло – wwl

Смежные вопросы