我是R的新手,我真的很难理解数据类型。
我有这个数据框:
> 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
列并获取订单的解决方案是什么。
我希望我能说清楚,很难对我这么不清楚的事情提出正确的问题。
答案 0 :(得分: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 df的列,然后您的下一个用于向量的操作不起作用。
正如joran所说,在这种情况下使用sapply
会返回向量,所以你会没事的。
你可以这样做:
sapply (df, class)
找出data.frame中每个列的类