我正在尝试找到一种方法将多行文本转换为
数据框。我不确定是否有办法可以使用read.delim()
读入多行文本并创建以下数据框
类似于rehape()
的东西?
数据结构如下:
A: 1
B: 2
C: 10
A: 34
B: 20
C: 6.7
A: 2
B: 78
C: 35
我想将此数据转换为类似以下数据框的内容:
A B C
1 2 10
34 20 6.7
2 78 35
道歉,如果有明显的方法可以做到这一点!
答案 0 :(得分:10)
怎么样:
s<-"A: 1
B: 2
C: 10
A: 34
B: 20
C: 6.7
A: 2
B: 78
C: 35
"
d<-read.delim(textConnection(s),header=FALSE,sep=":",strip.white=TRUE)
cols<-levels(d[,'V1'])
d<-data.frame(sapply(cols,function(x) {d['V2'][d['V1']==x]}, USE.NAMES=TRUE))
产生:
A B C
1 1 2 10.0
2 34 20 6.7
3 2 78 35.0
答案 1 :(得分:4)
以下是使用plyr包的方法:
require("plyr")
my.data <- "A: 1
B: 2
C: 10
A: 34
B: 20
C: 6.7
A: 2
B: 78
C: 35"
df <- read.delim(textConnection(my.data),header=FALSE,sep=":",strip.white=TRUE)
as.data.frame(dlply(df,.(V1),function(x) x[[2]]))
你得到了
A B C
1 1 2 10.0
2 34 20 6.7
3 2 78 35.0
通过玩dlply(df,.(V1))
或dlply(df,.(V1),function(x) x)
答案 2 :(得分:2)
我也在R-help上发布了这个问题,得到了Phil Spector的回复,建议unstack
。
这是对Leo Alekseyev的回应的修改
my.data <- "A: 1
B: 2
C: 10
A: 34
B: 20
C: 6.7
A: 2
B: 78
C: 35"
df <- read.delim(textConnection(my.data),header=FALSE,sep=":",strip.white=TRUE)
unstack(df, V2 ~ V1)
这导致:
A B C
1 1 2 10.0
2 34 20 6.7
3 2 78 35.0
与其他深思熟虑的答案相比,此方法的一些优点是您不需要提前指定列数。它也不需要任何额外的包。
答案 3 :(得分:0)
以下是使用重塑的一种解决方案
s<-"A: 1
B: 2
C: 10
A: 34
B: 20
C: 6.7
A: 2
B: 78
C: 35
"
d<-d<-read.delim(textConnection(s),header=FALSE,sep=":",strip.white=TRUE)
N<-nrow(d)%/%3
d$id<-rep(1:N,each=3)
reshape(d,dir="wide",timevar="V1",idvar="id")
哪个产生
id V2.A V2.B V2.C
1 1 1 2 10.0
4 2 34 20 6.7
7 3 2 78 35.0