我已经将插值后的数据存储在一个CSV文件中,文件有181行,每行第一个元素是标签,其余部分是时间序列数据,例如以下格式:
第1行:0, 980, 888, 720,987,543
第2行:0, 880, 999, 820,990,888, 980, 898, 780,987
第3行:1, 945, 856, 767,745,883
第4行:2, 780, 899, 920,890,988, 780, 998, 870,787
第5行:2, 800, 900, 822,999,880, 988, 899
其余181行也是如此,标签为0,1,2,3,4,5,6。请注意,每行的长度不同。我希望创建特征(例如,使用mean()作为其中一个特征),仅使用时间序列数据,即”980, 888, 720,987,543″,不包括标签”0″,并且我想对每一行进行操作,最终创建一个包含33个特征加上标签的数据框,像这样:
dim(labl_feat_df)[1] # 181 rowsdim(labl_feat_df)[2] # 34 columns (33 features and the label)
所以labl_feat_df将看起来像这样:
label mean(TS) SD(TS) ........ feat331 02 0...181 6
其中mean(TS)和sd(TS)分别是第一个和第二个特征。
所以我的问题是:如何读取长度不同的文件?如果需要逐行读取,如何高效地创建这33个特征并将它们添加到数据框中?
回答:
1) dplyr/tidyr 使用注释部分的Lines
,读取数据,添加行号id
,并将数据从宽格式重塑为长格式。删除NA行并进行汇总。
library(dplyr)library(tidyr)DF <- read.table(text =Lines, sep = ",", strip.white = TRUE, fill = NA)DF %>% mutate(id = 1:n()) %>% pivot_longer(-c(V1, id)) %>% drop_na %>% group_by(V1, id) %>% summarize(mean = mean(value), sd = sd(value)) %>% ungroup
结果如下:
# A tibble: 5 x 4 V1 id mean sd <int> <int> <dbl> <dbl>1 0 1 824. 190. 2 0 2 914. 80.33 1 3 839. 82.94 2 4 879. 84.05 2 5 898. 75.3
2) Base R 使用(1)中的DF
,使用reshape
将数据重塑为长格式,使用na.omit
删除NA,并使用aggregate
进行汇总:
DF2 <- na.omit(reshape(DF, dir = "long", varying = list(2:ncol(DF))))aggregate(V2 ~ V1 + id, DF2, function(x) c(mean = mean(x), sd = sd(x)))
结果如下:
V1 id V2.mean V2.sd1 0 1 823.60000 190.248002 0 2 913.55556 80.284043 1 3 839.20000 82.886674 2 4 879.11111 83.957505 2 5 898.28571 75.28770
注释
Lines <- "0, 980, 888, 720,987,5430, 880, 999, 820,990,888, 980, 898, 780,9871, 945, 856, 767,745,8832, 780, 899, 920,890,988, 780, 998, 870,7872, 800, 900, 822,999,880, 988, 899"