R 将数据从3行重新组织为1行
我需要重新组织csv文件中的数据,该文件包含大部分重复数据。我将数据导入数据帧中的R中,但我遇到以下问题:R 将数据从3行重新组织为1行,r,csv,reshape2,R,Csv,Reshape2,我需要重新组织csv文件中的数据,该文件包含大部分重复数据。我将数据导入数据帧中的R中,但我遇到以下问题: ID Language Author Keyword 12 eng Rob COLOR=Red 12 eng Rob SIZE=Large 12 eng Rob DD=1 15 eng John COLOR=Red 15 eng John SIZE=Med
ID Language Author Keyword
12 eng Rob COLOR=Red
12 eng Rob SIZE=Large
12 eng Rob DD=1
15 eng John COLOR=Red
15 eng John SIZE=Medium
15 eng John DD=2
我需要做的是将它转换成一行,每个关键字在一个单独的列中
ID Language Author COLOR SIZE DD
12 eng Rob Red Large 1
有什么想法吗?使用
plyr
ansstrsplit
您可以这样做:
library(plyr)
res <- ddply(dat,.(ID,Language,Author),function(x){
unlist(sapply(strsplit(x$Keyword,'='),'[',2))
})
colnames(res)[4:6] <- c('COLOR','SIZE','DD')
ID Language Author COLOR SIZE DD
1 12 eng Rob Red Large 1
2 15 eng John Red Medium 2
库(plyr)
res使用重塑2
尝试此操作:
tt <- read.table(header=T,text='ID Language Author Keyword
12 eng Rob COLOR=Red
12 eng Rob SIZE=Large
12 eng Rob DD=1
15 eng John COLOR=Red
15 eng John SIZE=Medium
15 eng John DD=2')
tt$Keyword <- as.character(tt$Keyword)
tt <- transform(tt, key_val = lapply(tt$Keyword,function(x) strsplit(x,'=')[[1]][2]),
key_var = lapply(tt$Keyword,function(x) strsplit(x,'=')[[1]][1]))
tt_new <- dcast (tt, ID + Language + Author ~ key_var, value.var='key_val')
tt使用restrape2
包这很简单:
使用中定义的tt
你的lappy
应该是sapply
,你需要一个值。var=“key\u val”
在你的dcast
调用中。没有意识到值。var
需要引号中的var,所以它给了我一个错误。我省略了它,但是在本例中,dcast
正确地猜测了正确的变量。谢谢。作为注意事项,这确实假设关键字总是COLOR
、SIZE
和DD
,并且总是按此顺序排列。如果这个假设是真的,那么它就可以工作了。我可以让它工作,但是在dcast()运行之后,我得到一个错误,它说:聚合函数丢失:默认为长度。然后我在每个新变量中得到1。我猜在真实的数据集中一定有不正确的地方,因为它在这个简化的数据集上工作得很好。有什么想法吗?我好像在什么地方有不同的数字。需要找出如何找到超过3行的ID并将其清除。如果出现了多次出现的ID
、语言
、作者
、和名称
,则会出现该警告。您可以通过在结果中查找除1以外的值来判断它是/它们是哪一个(基本上,当一个组合有多个值时,“重塑”将以某种方式将它们聚合为单个值,默认情况下,这只是计算有多少个值)。
tt <- read.table(header=T,text='ID Language Author Keyword
12 eng Rob COLOR=Red
12 eng Rob SIZE=Large
12 eng Rob DD=1
15 eng John COLOR=Red
15 eng John SIZE=Medium
15 eng John DD=2')
tt$Keyword <- as.character(tt$Keyword)
tt <- transform(tt, key_val = lapply(tt$Keyword,function(x) strsplit(x,'=')[[1]][2]),
key_var = lapply(tt$Keyword,function(x) strsplit(x,'=')[[1]][1]))
tt_new <- dcast (tt, ID + Language + Author ~ key_var, value.var='key_val')
library("reshape2")
tt <- cbind(tt, colsplit(tt$Keyword, "=", c("Name", "Value")))
tt_new <- dcast(tt, ID + Language + Author ~ Name, value.var="Value")
> tt_new
ID Language Author COLOR DD SIZE
1 12 eng Rob Red 1 Large
2 15 eng John Red 2 Medium