将向量转换为类似矩阵的对象
Transforming vector into matrix-like object
我在将向量转换为类似矩阵的对象时遇到了问题。乍一看,这题一定很简单,但我还没解决。
问题描述:
我有一些长向量,类似于下面提到的那个:
m <- c("100€", "25m²", "2 rooms", "12m²", "4 rooms", "500€", "3 rooms")
我想把它转成下面结构的data.frame(或矩阵):
price surface rooms
100€ 25m² 2 rooms
NA 12m² 4 rooms
500€ NA 3 rooms
你可以这样尝试,分别计算列索引和行索引,然后使用索引将向量分配给矩阵:
col <- ifelse(grepl("€", m), 1, ifelse(grepl("m²", m), 2, 3))
col
# [1] 1 2 3 2 3 1 3
row <- cumsum(c(T, diff(col) < 0)) # calculate the row index based on the column index,
# when you encounter a decrease of the column index,
# increase the row index by one
row
# [1] 1 1 1 2 2 3 3
mat <- matrix(nrow = max(row), ncol = max(col))
mat[cbind(row, col)] <- m
mat
# [,1] [,2] [,3]
#[1,] "100€" "25m²" "2 rooms"
#[2,] NA "12m²" "4 rooms"
#[3,] "500€" NA "3 rooms"
我在将向量转换为类似矩阵的对象时遇到了问题。乍一看,这题一定很简单,但我还没解决。
问题描述:
我有一些长向量,类似于下面提到的那个:
m <- c("100€", "25m²", "2 rooms", "12m²", "4 rooms", "500€", "3 rooms")
我想把它转成下面结构的data.frame(或矩阵):
price surface rooms
100€ 25m² 2 rooms
NA 12m² 4 rooms
500€ NA 3 rooms
你可以这样尝试,分别计算列索引和行索引,然后使用索引将向量分配给矩阵:
col <- ifelse(grepl("€", m), 1, ifelse(grepl("m²", m), 2, 3))
col
# [1] 1 2 3 2 3 1 3
row <- cumsum(c(T, diff(col) < 0)) # calculate the row index based on the column index,
# when you encounter a decrease of the column index,
# increase the row index by one
row
# [1] 1 1 1 2 2 3 3
mat <- matrix(nrow = max(row), ncol = max(col))
mat[cbind(row, col)] <- m
mat
# [,1] [,2] [,3]
#[1,] "100€" "25m²" "2 rooms"
#[2,] NA "12m²" "4 rooms"
#[3,] "500€" NA "3 rooms"