一种选择是使用a list
(但我认为在这种情况下长数据形式可能更方便,而且您的数据不是很大)。
假设你data.frame
被称为“mydf”:
## Create a matrix to subset each pair of columns
mat <- matrix(1:4, ncol = 2, byrow = TRUE)
## use `lapply` to subset and remove the offensive rows
lapply(sequence(nrow(mat)), function(x) {
temp <- mydf[mat[x, ]]
temp[temp[2] != 0, ]
})
# [[1]]
# Col_names1 Col_values1
# 1 a 98.00
# 2 b 12.00
# 4 e 0.12
#
# [[2]]
# Col_names2 Col_values2
# 1 f 1.0
# 2 h 0.8
基于@dayne 的回答,如果您的列以常规模式命名,您可以reshape
非常有效地使用来获取长格式。但是,它需要一个“id”变量(sequence(nrow(DF))
应该这样做)。
例子:
### Sample data
set.seed(1)
DF <- data.frame(col_names1 = sample(letters[1:13], 30, replace=TRUE),
col_values1 = sample(0:10, 30, replace=TRUE),
col_names2 = sample(letters[14:26], 30, replace=TRUE),
col_values2 = sample(0:10, 30, replace=TRUE))
### Add the ID
DF <- cbind(id = 1:nrow(DF), DF)
### Reshape the data into a long form
out <- reshape(DF, direction = "long", idvar="id",
varying = setdiff(names(DF), "id"), sep = "")
### Subset
out2 <- out[out$col_values != 0, ]
head(out2)
# id time col_names col_values
# 1.1 1 1 d 5
# 2.1 2 1 e 6
# 3.1 3 1 h 5
# 4.1 4 1 l 2
# 5.1 5 1 c 9
# 6.1 6 1 l 7