R 是否可以使数据框接受Alist作为行?
考虑R 是否可以使数据框接受Alist作为行?,r,dataframe,names,R,Dataframe,Names,考虑 items<-alist(2^1,2^2,2^3,2^3) 作为我的输出。我会使用row.names参数,但它拒绝重复的名称,否则无法确定 尝试的自然方式是 items<-alist(2^1,2^2,2^3,2^3) outs<-sapply(items,eval) data.frame(items=items,results=outs) lappy并不公平: > outs<-lapply(items,eval) > data.frame(items
items<-alist(2^1,2^2,2^3,2^3)
作为我的输出。我会使用row.names
参数,但它拒绝重复的名称,否则无法确定
尝试的自然方式是
items<-alist(2^1,2^2,2^3,2^3)
outs<-sapply(items,eval)
data.frame(items=items,results=outs)
lappy
并不公平:
> outs<-lapply(items,eval)
> data.frame(items=items,results=outs)
items.2.1 items.2.2 items.2.3 items.2.3.1 results.2 results.4 results.8 results.8.1
1 2 4 8 8 2 4 8 8
输出数据帧(项目=项目,结果=输出)
项目2.1项目2.2项目2.3项目2.3.1结果2结果4结果8结果8.1
1 2 4 8 8 2 4 8 8
我知道我可以使用矩阵而不是数据框,但这不是我要问的问题。@nicola在评论中的建议几乎奏效,但没有正确显示:
> data.frame(items=I(items),results=vapply(items,eval,1))
items results
1 ^, 2, 1 2
2 ^, 2, 2 4
3 ^, 2, 3 8
4 ^, 2, 3 8
如果你不在乎显示器,我会用它。如果您想让它很好地显示,您需要将语言对象转换为表达式对象,例如
eitems <- lapply(items, as.expression)
> data.frame(items=I(eitems),results=vapply(items,eval,1))
items results
1 2^1 2
2 2^2 4
3 2^3 8
4 2^3 8
eitems data.frame(items=I(eitems),results=vapply(items,eval,1))
项目结果
1 2^1 2
2 2^2 4
3 2^3 8
4 2^3 8
或者,如果不想再次计算它们,只需将它们分解为字符值:
ditems <- sapply(items, deparse)
> data.frame(items = ditems, results=vapply(items,eval,1))
items results
1 2^1 2
2 2^2 4
3 2^3 8
4 2^3 8
ditems data.frame(items=ditems,results=vapply(items,eval,1))
项目结果
1 2^1 2
2 2^2 4
3 2^3 8
4 2^3 8
当您希望列表成为单列时,请使用I
函数:data.frame(items=I(items),results=vapply(items,eval,1))
。您知道I()
的用法记录在哪里吗?我看不出任何明显的地方,即使是I()
本身的文档。@J.Mini?I
和?data.frame
(详细信息部分)讨论I
的用法。deparse
解决方案似乎比as.expression
解决方案简单得多,我不确定您为什么提到as.expression
。对于这些情况,是否有理由不使用deparse
替代?deparse()
不保证成功。有一些奇怪的R对象,它无法处理。我想它可以处理alist()
将产生的任何东西,但我可能错了。计算表达式的值与对其进行去粗化、解析和计算的值不同,这一点也非常普遍。最常见的原因是在除法期间舍入,例如1.000000000000001除法为1,但在内部它不等于1。
eitems <- lapply(items, as.expression)
> data.frame(items=I(eitems),results=vapply(items,eval,1))
items results
1 2^1 2
2 2^2 4
3 2^3 8
4 2^3 8
ditems <- sapply(items, deparse)
> data.frame(items = ditems, results=vapply(items,eval,1))
items results
1 2^1 2
2 2^2 4
3 2^3 8
4 2^3 8