如何解决当df2 $ columnB是单个空格分隔的列表时,使用R比较数据帧以找到df2 $ columnB中df1 $ columnA的第一个出现
我对R中的数据帧有一个疑问。我想获取一个data.frame,dfy,并在dfx $ workers中找到dfy $ workerId的第一个匹配项,以创建一个新的数据帧dfz,它也是dfx的副本dfy $ workerId在dfx $ wokers中首次出现为dfz $ highestRankingGroup。因为dfx $ workers是一个单个的分隔字符串,所以有点棘手。我最初的计划是在Perl中执行此操作,但我想找到一种在R中工作的方式,而不必写到temp。文件。 感谢您的时间。y <- \"name,workerId,aptitude
joe,4,34
steve,5,42
jon,7,23
nick,8,122\"
x <- \"workers,projectscore
1 2 3 8,92
1 2 5 9,89
3 5 7,85
1 8 9 10,82
4 5 7 8,83
1 3 5 7 8,79\"
z <- \"name,aptitude,highestRankingGroup
joe,0.34,5
steve,0.42,2
jon,0.23,3
nick,0.122,1\"
dfy <- read.csv(textConnection(y),header=TRUE,sep=\",\",stringsAsFactors=FALSE)
dfx <- read.csv(textConnection(x),stringsAsFactors=FALSE)
dfz <- read.csv(textConnection(z),stringsAsFactors=FALSE)
解决方法
首先,将“ 1”列添加到数据集“ 2”中
dfx$highestRankingGroup <- seq(1,length(dfx$projectScore))
既然您已经提到了perl
,就可以做一个熟悉的perl事情,并简单地将workers
列拆分为空白。我将拆分与plyr
软件包中的函数结合使用,这些函数总是很不错的使用。
library(plyr)
df.l <- dlply(dfx,\"projectScore\")
f.reshape <- function(x) {
wrk <- strsplit(x$workers,\"\\\\s\",perl = TRUE)
data.frame(worker = wrk[[1]],projectScore = x$projectScore,highestRankingGroup = x$highestRankingGroup
)
}
df.tmp <- ldply(df.l,f.reshape)
df.z1 <- merge(df.tmp,dfy,by.x = \"worker\",by.y = \"workerId\")
现在,您必须在projectScore
列中查找最大值:
df.z2 <- ddply(df.z1,\"name\",function(x) x[x$projectScore == max(x$projectScore),])
这将产生:
R> df.z2
worker .id projectScore highestRankingGroup name aptitude
1 4 83 83 5 joe 34
2 7 85 85 3 jon 23
3 8 92 92 1 nick 122
4 5 89 89 2 steve 42
R>
您可以根据自己的喜好重塑df.z2
数据框。只需查看不同的步骤和产生的对象,以了解在哪一步引入了不同的列等。
,在开始之前,建议您使用@mropa的答案。这个答案让我对您的问题感到很有趣。从好的方面来说,它确实与函数闭包有关;)
本质上,我创建了一个返回两个函数的函数。
updateDFz = function(dfy) {
## Create a default dfz matrix
dfz = dfy
dfz$HRG = 10000 ## Big max value
counter = 0
## Update the dfz matrix after every row
update = function(x) {
counter <<- counter + 1
for(i in seq_along(x)) {
if(is.element(x[i],dfz$workerId))
dfz[dfz$workerId == x[i],]$HRG <<- min(dfz[dfz$workerId == x[i],]$HRG,counter)
}
return(dfz)
}
## Get the dfz matrix
getDFz = function()
return(dfz)
list(getDFz=getDFz,update=update)
}
f = updateDFz(dfy)
lapply(strsplit(dfx$workers,\" \"),f$update)
f$getDFz()
正如我所说的,有点乐趣;)
,希望有人觉得这有用。
# Recieves a data.frame and a search column
# Returns a data.frame of the first occurances of all unique values of the \"search\" column
getfirsts <- function(data,searchcol){
rows <- as.data.frame(match(unique(data[[searchcol]]),data[[searchcol]]))
firsts = data[rows[[1]],]
return(firsts)
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。