如何将行转换为 R 数据框中的列?
How to turn rows into columns in an R dataframe?
我希望我所有的行都转换成它们自己的列,这样最后所有内容都会在一行中。这是我的数据框现在的样子:
track time UTM_WGS84.Longitude UTM_WGS84.Latitude
1 1 2015-10-14 23:59:55.711 5.481687 51.43635
2 1 2015-10-14 23:59:55.717 5.481689 51.43635
3 1 2015-10-14 23:59:55.723 5.481689 51.43635
4 1 2015-10-14 23:59:55.730 5.481690 51.43635
5 1 2015-10-14 23:59:55.763 5.481691 51.43635
6 1 2015-10-14 23:59:55.804 5.481691 51.43635
7 1 2015-10-14 23:59:55.840 5.481692 51.43635
8 2 2015-10-14 23:59:55.882 5.481692 51.43635
9 2 2015-10-14 23:59:56.031 5.481693 51.43635
10 2 2015-10-14 23:59:56.041 5.481693 51.43635
11 2 2015-10-14 23:59:56.047 5.481693 51.43635
12 2 2015-10-14 23:59:56.053 5.481694 51.43635
13 3 2015-10-14 23:59:56.081 5.481695 51.43635
14 3 2015-10-14 23:59:56.121 5.481695 51.43635
15 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 B
1 2 1 100
2 1 2 200
3 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
Result:
> new.df
track2.1 A2.1 B2.1 track1.2 A1.2 B1.2 track5.3 A5.3 B5.3
1 2 1 100 1 2 200 5 3 300
看看这是不是你想要的:
df=matrix(1:12,ncol=3)
df
# [,1] [,2] [,3]
#[1,] 1 5 9
#[2,] 2 6 10
#[3,] 3 7 11
#[4,] 4 8 12
c(t(df))
# [1] 1 5 9 2 6 10 3 7 11 4 8 12
作为数据框
data.frame(t(c(t(df))))
# X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12
#1 1 5 9 2 6 10 3 7 11 4 8 12
我希望我所有的行都转换成它们自己的列,这样最后所有内容都会在一行中。这是我的数据框现在的样子:
track time UTM_WGS84.Longitude UTM_WGS84.Latitude
1 1 2015-10-14 23:59:55.711 5.481687 51.43635
2 1 2015-10-14 23:59:55.717 5.481689 51.43635
3 1 2015-10-14 23:59:55.723 5.481689 51.43635
4 1 2015-10-14 23:59:55.730 5.481690 51.43635
5 1 2015-10-14 23:59:55.763 5.481691 51.43635
6 1 2015-10-14 23:59:55.804 5.481691 51.43635
7 1 2015-10-14 23:59:55.840 5.481692 51.43635
8 2 2015-10-14 23:59:55.882 5.481692 51.43635
9 2 2015-10-14 23:59:56.031 5.481693 51.43635
10 2 2015-10-14 23:59:56.041 5.481693 51.43635
11 2 2015-10-14 23:59:56.047 5.481693 51.43635
12 2 2015-10-14 23:59:56.053 5.481694 51.43635
13 3 2015-10-14 23:59:56.081 5.481695 51.43635
14 3 2015-10-14 23:59:56.121 5.481695 51.43635
15 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 B
1 2 1 100
2 1 2 200
3 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
Result:
> new.df
track2.1 A2.1 B2.1 track1.2 A1.2 B1.2 track5.3 A5.3 B5.3
1 2 1 100 1 2 200 5 3 300
看看这是不是你想要的:
df=matrix(1:12,ncol=3)
df
# [,1] [,2] [,3]
#[1,] 1 5 9
#[2,] 2 6 10
#[3,] 3 7 11
#[4,] 4 8 12
c(t(df))
# [1] 1 5 9 2 6 10 3 7 11 4 8 12
作为数据框
data.frame(t(c(t(df))))
# X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12
#1 1 5 9 2 6 10 3 7 11 4 8 12