2

df の 2 つの (作成された) サンプル行のサンプル:

userid   facultyid  courseid schoolid
167       265        NA       1678  
167       71111      301      NA

上記の例のように、重複するユーザー ID が数百あるとします。ただし、大部分のユーザー ID は異なる値を持っています。

最初の値が NA でない限り、(2 のうちの) 1 番目の行の列の値に固執するように、重複したユーザー ID を持つ行を結合するにはどうすればよいですか (この場合、NA は 2 番目の値から得られた値で再設定されます)行)?

本質的に、上記の例から引き出すと、私の理想的な出力には次のものが含まれます。

userid   facultyid  courseid schoolid
167       265        301       1678  
4

4 に答える 4

1

を使用した別のアプローチを次に示しddplyます。

# requires the plyr package
library(plyr)

# Your example dataframe with added lines
schoolex <- data.frame(userid = c(167, 167, 200, 203, 203), facultyid = c(265, 71111, 200, 300, NA), 
                        courseid = c(NA, 301, 302, 303, 303), schoolid = c(1678, NA, 1678, NA, 1678))

schoolex_duprm <- ddply(schoolex, .(userid), summarize, facultyid2 = facultyid[!is.na(facultyid)][1], 
                               courseid2 = courseid[!is.na(courseid)][1], 
                               schoolid2 = schoolid[!is.na(schoolid)][1])
于 2015-03-13T20:18:09.247 に答える
1
# initialize a vector that will contain row numbers which should be erased
rows.to.erase <- c()

# loop over the rows, starting from top
for(i in 1:(nrow(dat)-1)) {
  if(dat$userid[i] == dat$userid[i+1]) {
    # loop over columns to recuperate data when a NA is present
    for(j in 2:4) {
      if(is.na(dat[i,j]))
        dat[i,j] <- dat[i+1,j]
    }
    rows.to.erase <- append(rows.to.erase, i+1)
  }
}

dat.clean <- dat[-rows.to.erase,]
dat.clean
#   userid facultyid courseid schoolid
# 1    167       265      301     1678
于 2015-03-13T20:06:44.393 に答える
1

これは、plyr の簡単なワンライナーです。あなたが尋ねたよりも少し一般的に書きました:

 a <- data.frame(x=c(1,2,3,1,2,3,1,2,3),y=c(2,3,1,1,2,3,2,3,1),
       z=c(NA,1,NA,2,NA,3,4,NA,5),zz=c(1,NA,2,NA,3,NA,4,NA,5))

 ddply(a,~x+y,summarize,z=first(z[!is.na(z)]),zz=first(zz[!is.na(zz)]))

データフレームの名前が a, の場合、元の質問に具体的に答える:

 ddply(a,~userid,summarize,facultyid=first(facultyid[!is.na(facultyid)]),
         courseid=first(courseid[!is.na(courseid)],
         schoolid=first(schoolid[!is.na(schoolid)])
于 2015-03-13T20:19:02.807 に答える