использование R для сравнения фреймов данных, чтобы найти первое вхождение в df1 $ columnA в df2 $ columnB, когда df2 $ columnB - это список, разделенный пробелами - PullRequest
1 голос
/ 13 апреля 2011

У меня есть вопрос относительно фреймов данных в R. Я хочу взять data.frame, dfy и найти первое вхождение dfy $ workerId в dfx $ worker, чтобы создать новый фрейм данных dfz, копию dfx он также содержит первое вхождение dfy $ workerId в dfx $ wokers как dfz $ Самый высокийRankingGroup. Это немного сложнее, потому что dfx $ worker представляет собой отдельную строку с разделителями. Мой первоначальный план состоял в том, чтобы сделать это в 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,workerId,aptitude,highestRankingGroup
joe,4,0.34,5
steve,5,0.42,2
jon,7,0.23,3
nick,8,0.122,1"

dfy <- read.csv(textConnection(y), header=TRUE, sep=",", stringsAsFactors=FALSE)  
dfx <- read.csv(textConnection(x), header=TRUE, sep=",", stringsAsFactors=FALSE)  
dfz <- read.csv(textConnection(z), header=TRUE, sep=",", stringsAsFactors=FALSE)

Ответы [ 3 ]

2 голосов
/ 13 апреля 2011

Сначала добавьте столбец highestRankingGroup в набор данных dfx

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 в соответствии со своими предпочтениями. Просто посмотрите на различные этапы и созданные объекты, чтобы увидеть, на каком этапе вводятся различные столбцы и т. Д.

1 голос
/ 17 декабря 2012

Надеюсь, кто-нибудь найдет это полезным.

# 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)
}
1 голос
/ 13 апреля 2011

Прежде чем начать, я рекомендую вам ответить с @ 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()

Как я уже сказал, немного весело;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...