3 Stimmen

Zusammenführen mehrerer duplizierter Reihen eines Datenrahmens in R

Ich habe einen großen Datensatz mit sechs Spalten, wobei die erste Spalte eine Liste von Identifikatoren ist, die Verhältniswerte über die verbleibenden fünf Spalten hinweg abgleichen:

    Identifier cd_log.ratios cs_log.ratios me_log.ratios pn_log.ratios sm_log.ratios
          A2ICC5     0.3784142            NA            NA            NA            NA
          A2ICC5            NA    -0.4910396            NA            NA            NA
          A2ICC5            NA            NA    -0.1755617            NA            NA
          A2ICC5            NA            NA            NA            NA     0.2279259
          A2ICC8     0.3045490            NA            NA            NA            NA
          A2ICC8            NA     0.2045638            NA            NA            NA

Beachten Sie, dass in den ersten vier Zeilen vier der fünf Verhältnisspalten einen duplizierten Identifikator teilen. Wie kann ich mein Datenframe konsolidieren, um duplizierte Identifikatoren zu entfernen und die Verhältnisse in eine Zeile zu verschieben? Die Ausgabe würde ungefähr so aussehen:

Identifier  cd_log.ratios   cs_log.ratios   me_log.ratios   pn_log.ratios   sm_log.ratios
A2ICC5      0.3784142      -0.4910396      -0.1755617              NA       0.2279259
A2ICC8       0.304549       0.2045638              NA              NA              NA

Vielen Dank im Voraus!

10voto

eddi Punkte 48292
df = read.table(text = '   Identifier cd_log.ratios cs_log.ratios me_log.ratios pn_log.ratios sm_log.ratios
          A2ICC5     0.3784142            NA            NA            NA            NA
          A2ICC5            NA    -0.4910396            NA            NA            NA
          A2ICC5            NA            NA    -0.1755617            NA            NA
          A2ICC5            NA            NA            NA            NA     0.2279259
          A2ICC8     0.3045490            NA            NA            NA            NA
          A2ICC8            NA     0.2045638            NA            NA            NA', header = T)

library(data.table)
dt = data.table(df)

dt[, lapply(.SD, na.omit), by = Identifier]
#   Identifier cd_log.ratios cs_log.ratios me_log.ratios pn_log.ratios sm_log.ratios
#1:     A2ICC5     0.3784142    -0.4910396    -0.1755617            NA     0.2279259
#2:     A2ICC8     0.3045490     0.2045638            NA            NA            NA

2voto

cksun Punkte 61

Eddis Antwort mit data.table ist großartig.

In dieser Situation werden melt und cast in library(reshape) auch funktionieren.

dfm <- melt(df, id.var='Identifier')
dfm <- subset(dfm, !is.na(value), )
cast(dfm)
  Identifier cd_log.ratios cs_log.ratios me_log.ratios sm_log.ratios
1     A2ICC5     0.3784142    -0.4910396    -0.1755617     0.2279259
2     A2ICC8     0.3045490     0.2045638            NA            NA

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X