2016-02-09 3 views
0

Я новичок в R, и я действительно пытаюсь понять типы данных.R - Список заметок/Вектор

У меня есть этот dataframe:

> names = c('First Name', 'Second Name') 
> timestamps = c('123,124,125,126', '234,235,236') 
> df = data.frame(names, timestamps) 
     names  timestamps 
1 First Name 123,124,125,126 
2 Second Name  234,235,236 

На данном этапе, временные метки являются символы. Хотите, чтобы превратить его в список, так что я:

df$timestamps <- lapply(df$timestamps, function(x) as.numeric(unlist(strsplit(as.character(x), ',')))) 
> df 
     names   timestamps 
1 First Name 123, 124, 125, 126 
2 Second Name  234, 235, 236 

Тогда я хочу, чтобы создать три колонки, count, min, max.

df$count <- lapply(df$timestamps, function(x) length(x)) 
df$min <- lapply(df$timestamps, function(x) min(x)) 
df$max <- lapply(df$timestamps, function(x) max(x)) 

Но тогда он перестает работать. Я хочу заказать его count и создать столбец duration.

Я пробовал:

> df$duration <- df$max - df$min 
Error in df$max - df$min : non-numeric argument to binary operator 
> df$duration <- lapply(df, function(x) x$max - x$min) 
Error in x$max : $ operator is invalid for atomic vectors 
> df <- df[order(-df$count),] 
Error in -df$count : invalid argument to unary operator 

Если я бегу

> typeof(df$count) 
[1] "list" 

Я хотел integer, почему нет? Если я выполнить:

> typeof(length(df[1,]$timestamps)) 
[1] "integer" 

Так df$count должен быть массивом integer с, не так ли?

Является ли мой подход правильным? Какой тип данных проще всего манипулировать? Каково решение получить столбцы duration и получить их.

Надеюсь, что я могу быть ясным, трудно задавать вопрос правильно о чем-то, что неясно для меня.

+2

От создания 'count' переменной вперед, попробуйте использовать' sapply' довольно чем 'lapply'. – joran

+2

... FWIW, происхождение вашей путаницы, вероятно, связано с тем, что вы начинаете с переменной 'timestamps' как столбца списка в фрейме данных, что может быть сделано, но несколько« нестандартно ». Более «обычным» способом структурирования таких данных было бы преобразование его в длинный формат с уникальной строкой для каждой комбинации имен/временных меток, чтобы исходный фрейм данных имел 7 строк (или 8 в зависимости от того, как вы хотите для обработки отсутствующих данных), а не 2. – joran

ответ

0

Проблема заключается в том, что здесь

df$count <- lapply(df$timestamps, function(x) length(x)) 
df$min <- lapply(df$timestamps, function(x) min(x)) 
df$max <- lapply(df$timestamps, function(x) max(x)) 

Вы создаете списки, которые идут в колоннах data.frame ЦФ, а затем ваши последующие операции, которые предназначены для векторов не работают.

Поскольку joran указывает, что использование sapply вернет векторы в этом случае, так что с вами все будет в порядке.

Вы можете сделать:

sapply (df, class) 

выяснить класс каждого из столбцов в data.frame

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