我想将所有行转换为各自的列,最终所有数据都在一行中。我的数据框当前看起来是这样的:
track time UTM_WGS84.Longitude UTM_WGS84.Latitude1 1 2015-10-14 23:59:55.711 5.481687 51.436352 1 2015-10-14 23:59:55.717 5.481689 51.436353 1 2015-10-14 23:59:55.723 5.481689 51.436354 1 2015-10-14 23:59:55.730 5.481690 51.436355 1 2015-10-14 23:59:55.763 5.481691 51.436356 1 2015-10-14 23:59:55.804 5.481691 51.436357 1 2015-10-14 23:59:55.840 5.481692 51.436358 2 2015-10-14 23:59:55.882 5.481692 51.436359 2 2015-10-14 23:59:56.031 5.481693 51.4363510 2 2015-10-14 23:59:56.041 5.481693 51.4363511 2 2015-10-14 23:59:56.047 5.481693 51.4363512 2 2015-10-14 23:59:56.053 5.481694 51.4363513 3 2015-10-14 23:59:56.081 5.481695 51.4363514 3 2015-10-14 23:59:56.121 5.481695 51.4363515 3 2015-10-14 23:59:56.165 5.481695 51.43635
我不确定这是否可行,但这是我希望列看起来的样子:
time1.1 - UTM_WGS84.Longitude1.1 - UTM_WGS84.Latitude1.1 - time1.2 - UTM_WGS84.Longitude1.2 - UTM_WGS84.Latitude1.2 - time2.1 - UTM_WGS84.Longitude2.1 - UTM_WGS84.Latitude2.1
其中第一个数字是轨迹,第二个数字是该轨迹的行号。我知道这是一个奇怪的请求,但我正在尝试找到一种方法,将所有这些数据提供给机器学习方法来识别步行模式。
关于如何做到这一点,有什么想法吗?
回答:
查看这个演示:
> df <- data.frame(track = c(2,1,5), A = c(1,2,3), B = c(100, 200, 300))> df track A B1 2 1 1002 1 2 2003 5 3 300
如您所愿,最终所有数据都在一行中,意味着将所有行合并成一个列表?所以:
> ls <- unlist(as.list(t(df)))> ls[1] 2 1 100 1 2 200 5 3 300
但是如何处理列名呢?一个笨方法可能会奏效:
> row.num <- row.names(df)> row.num[1] "1" "2" "3"> column.name <- colnames(df)> column.name[1] "track" "A" "B" > track <- as.character(df$track)> track[1] "2" "1" "5"
然后获取新的列名:
> new.column.names <- c()> for(i in 1:length(track)) { for(k in 1:length(column.name)) { str <- paste(column.name[k], track[i], sep = "") str <- paste(str, row.num[i], sep = ".") new.column.names <- c(new.column.names, str) } }> new.column.names[1] "track2.1" "A2.1" "B2.1" "track1.2" "A1.2" "B1.2" "track5.3"[8] "A5.3" "B5.3"
最后,将ls
和new.column.names
分配给你的新数据框:
> new.df <- t(data.frame(ls))> colnames(new.df) <- new.column.names> rownames(new.df) <- 1
结果:
> new.df track2.1 A2.1 B2.1 track1.2 A1.2 B1.2 track5.3 A5.3 B5.31 2 1 100 1 2 200 5 3 300