我试图获取数据帧并将其转换为包含特定列的数据帧列表。
dfs <- data.frame(c('apple', 'apple', 'apple', 'apple'), c('pear','pear','pear','pear'),c('5.30','5.50','5.12','5.63'),c('2.12','2.30','2.40','2.13'),c('5.31','5.55','5.20','5.63'),c('2.15','2.35','2.44','2.15'))
names(dfs) <- c('apple','pear','price_apple','price_pear','ask_apple','ask_pear')
> dfs
apple pear price_apple price_pear ask_apple ask_pear
1 apple pear 5.30 2.12 5.31 2.15
2 apple pear 5.50 2.30 5.55 2.35
3 apple pear 5.12 2.40 5.20 2.44
4 apple pear 5.63 2.13 5.63 2.15
最终目标是列出第一项&#39; apple&#39;和第二项“梨”#。 price和ask变量将是各自列表元素的数据框中的列。
以下建议仅适用于样本数据,但未能推断到真实数据集:
tmp <- reshape(dfs[-(1:2)], sep="_", direction="long", timevar="fruit", varying=TRUE)
split(tmp, tmp$fruit)
但返回错误:
猜测错误(变化): 没能从名字中猜出时变变量
reshapeLong出错(数据,idvar = idvar,timevar = timevar,变化=变化,: &#39;改变&#39;参数必须是相同的长度
答案 0 :(得分:1)
你可以这样做:
list(
appledf = dfs[, grep("apple", colnames(dfs))],
peardf = dfs[, grep("pear", colnames(dfs))]
)
这给出了:
[[1]]
apple price_apple ask_apple
1 apple 5.30 5.31
2 apple 5.50 5.55
3 apple 5.12 5.20
4 apple 5.63 5.63
[[2]]
pear price_pear ask_pear
1 pear 2.12 2.15
2 pear 2.30 2.35
3 pear 2.40 2.44
4 pear 2.13 2.15
答案 1 :(得分:1)
reshape
到一个长文件然后split
:
tmp <- reshape(dfs[-(1:2)], sep="_", direction="long", timevar="fruit", varying=TRUE)
split(tmp, tmp$fruit)
#$apple
# fruit price ask id
#1.apple apple 5.30 5.31 1
#2.apple apple 5.50 5.55 2
#3.apple apple 5.12 5.20 3
#4.apple apple 5.63 5.63 4
#
#$pear
# fruit price ask id
#1.pear pear 2.12 2.15 1
#2.pear pear 2.30 2.35 2
#3.pear pear 2.40 2.44 3
#4.pear pear 2.13 2.15 4
可以说split
甚至不需要进一步分析。
答案 2 :(得分:1)
fnamevec <- c('orange', 'pear')
fruitlist <- list()
for(i in 1:2){
temp <- dfs[,grep(as.character(fnamevec[i]), colnames(dfs))]
fruitlist[[i]] <- temp
}