我有一个data.frame
和一个matrix
,它们有相同的行和不同的列数。
matrix
中的所有元素都是整数,但data.frame
在某些列中包含字符。
我想链接这些文件的行,也就是说,如果我删除了matrix
中的一行,那么data.frame
中的同一行就会被自动删除,或者当我用它的一列对data.frame
的元素排序时,矩阵中的元素就会相应地排序。
添加注意:我想保持matrix
作为整数矩阵,所以我不能使用cbind
。
发布于 2015-07-01 04:16:24
对此有(至少)两种解决方案。简单的选择是创建一个新的data.frame
,其中包括这样的两行:
样本数据
set.seed(123)
df <- data.frame(ID = 1:26, Group = sample(c("A", "B"), 26, TRUE))
mat <- matrix(rnorm(78), ncol = 3, dimnames = list(1:26, paste0("Val", 1:3)))
创建新的data.frame
,存储矩阵列的名称以供以后参考:
new_df <- cbind(df, mat)
mat_cols <- colnames(mat)
做一些补充:
new_df <- new_df[seq(1, 25, 2), ]
在需要时将矩阵提取出来:
as.matrix(new_df[, mat_cols])
另一种选择是使用S3或S4类。例如,生物导体包Biobase
有一个ExpressionSet
类,它可以保存matrix
和表型数据,并且可以对两者进行子集(尽管矩阵具有相反的行和列)。
如果您想做得更简单一些(ExpressionsSet
的实现可能比较复杂),下面是一个S3实现:
as.JoinedUp <- function(data_frame, matrix) {
stopifnot(is.data.frame(data_frame), is.matrix(matrix), nrow(data_frame) == nrow(matrix))
x <- list(data_frame = data_frame, matrix = matrix)
class(x) <- "JoinedUp"
x
}
`[.JoinedUp` <- function(x, i = NULL, j = NULL) {
if (is.null(i)) {
i <- 1:nrow(x$data_frame)
}
if (is.null(j)) {
j <- union(colnames(x$data_frame), colnames(x$matrix))
}
stopifnot(is.character(j))
x$data_frame <- x$data_frame[i, intersect(j, colnames(x$data_frame)), drop = FALSE]
x$matrix <- x$matrix[i, intersect(j, colnames(x$matrix)), drop = FALSE]
x
}
`[<-.JoinedUp` <- function(x, i = NULL, j = NULL, value) {
if (is.null(j)) {
j <- union(colnames(x$data_frame), colnames(x$matrix))
}
if (is.null(i)) {
i <- 1:nrow(x$data_frame)
}
stopifnot(is.character(j))
if (!is.matrix(value) & !is.data.frame(value)) {
value <- as.data.frame(t(value), stringsAsFactors = FALSE)
}
stopifnot(ncol(value) == length(j))
if (any(j %in% colnames(x$data_frame))) {
df_cols <- intersect(j, colnames(x$data_frame))
x$data_frame[i, df_cols] <- value[, match(df_cols, j)]
}
if (any(j %in% colnames(x$matrix))) {
mat_cols <- intersect(j, colnames(x$matrix))
x$matrix[i, mat_cols] <- data.matrix(value[, match(mat_cols, j)])
}
x
}
示例:
new_obj <- as.JoinedUp(df, mat)
new_obj[1:3, ]
new_obj[, c("ID", "Val1")]
new_obj[10:15, ]$matrix
new_obj <- new_obj[order(new_obj$matrix[, "Val1"]), ]
new_obj[1:5, c("ID", "Val1")] <- data.frame(ID = 20:24, Val1 = 0)
这只是您需要的一个框架;您可能还想为dim
、nrow
、ncol
等定义方法。
发布于 2015-07-01 01:57:42
试试这个例子:
#dummy data
set.seed(123)
df1 <- data.frame(ID=1:3, x=letters[1:3])
m1 <- matrix(c(1:3,runif(6)), ncol=3)
#cbind data.frame and matrix, results in a data.frame object
res <- cbind(df1, m1)
res
# ID x 1 2 3
# 1 1 a 1 0.2875775 0.8830174
# 2 2 b 2 0.7883051 0.9404673
# 3 3 c 3 0.4089769 0.0455565
#subset 2nd row
res[ 2,]
# ID x 1 2 3
# 2 2 b 2 0.7883051 0.9404673
#order by 4th column
res[ order(res[ ,4 ]), ]
# ID x 1 2 3
# 1 1 a 1 0.2875775 0.8830174
# 3 3 c 3 0.4089769 0.0455565
# 2 2 b 2 0.7883051 0.9404673
https://stackoverflow.com/questions/31157791
复制相似问题