根据父变量名创建数据框列表

时间:2018-04-19 21:40:14

标签: r list dataframe

我试图获取数据帧并将其转换为包含特定列的数据帧列表。

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;参数必须是相同的长度

3 个答案:

答案 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
}