微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当df2 $ columnB是单个空格分隔的列表时,使用R比较数据帧以找到df2 $ columnB中df1 $ columnA的第一个出现

如何解决当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 举报,一经查实,本站将立刻删除。