2017-08-11 20 views
1

Ich habe einen Datenrahmen mit einer großen Anzahl von Spalten, jede Zeile hat eine Reihe von -1 Werte und ich möchte nur die Werte in einer Zeile, die nicht -1 sind. Zum Beispiel, wenn meine Daten:Extrahieren von Werten aus Zeilen in R

A1 A2 A3 A4 A5 
-1 -1 2 -1 6 
2 -1 -1 -1 -1 
4 -1 -1 -1 3 
6 5 -1 2 2 

ich die Ausgabe wollen abgesehen von -1 zu anderen Variablen alle Werte in einer Zeile zu extrahieren, sagen:

V1 V2 V3 V4 
2 6 
2 
4 3 
6 5 2 2 

Zeile 1 und Zeile 3 haben zwei Werte, die nicht -1 sind, so werden diese zwei Werte V1 und V2 verschoben und dann werden V3 und V4 leer. Zeile 2 hat einen Wert von 1, so dass sie V1 belegt, so dass V2, V3 und V4 für diese Zeile leer sind. Zeile 4 hat vier Werte, die nicht -1 sind. Dann werden alle diese Werte in neuen Variablen V1 bis V4 belegt.

Antwort

1

Sieht aus wie wir dies mit apply tun können

Filter(function(x) !all(is.na(x)), as.data.frame(t(apply(df1, 1, 
       function(x) c(x[x!= -1], rep(NA, sum(x == -1))))))) 
# V1 V2 V3 V4 
#1 2 6 NA NA 
#2 2 NA NA NA 
#3 4 3 NA NA 
#4 6 5 2 2 
0

dt2 ist der endgültige Ausgang.

# Create example data frame 
dt <- read.table(text = "A1 A2 A3 A4 A5 
-1 -1 2 -1 6 
       2 -1 -1 -1 -1 
       4 -1 -1 -1 3 
       6 5 -1 2 2", 
       header = TRUE) 

# Replace -1 with NA 
dt[dt == -1] <- NA 

# Sort each row in the data frame, the result is a list 
dt_list <- apply(dt, 1, sort) 

# Find the maximum length of each row with non-NA values 
max_len <- max(sapply(dt_list, length)) 

# Add NA based on the length of each row 
dt_list2 <- lapply(dt_list, function(x){ 
    if (length(x) < max_len){ 
    x <- c(x, rep(NA, max_len - length(x))) 
    } 
    return(x) 
}) 

# Combine all rows, create a new data frame 
dt2 <- as.data.frame(do.call(rbind, dt_list2)) 

# Change the column name 
colnames(dt2) <- paste0("V", 1:ncol(dt2)) 

dt2 
    V1 V2 V3 V4 
1 2 6 NA NA 
2 2 NA NA NA 
3 3 4 NA NA 
4 2 2 5 6 
1
con <- textConnection(" 
A1 A2 A3 A4 A5 
-1 -1 2 -1 6 
2 -1 -1 -1 -1 
4 -1 -1 -1 3 
6 5 -1 2 2") 

df <- read.delim(con, sep = " ") 

df2 <- df 
df2[,] <- "" 
m <- 0 

for(i in 1:nrow(df)) { 
    x <- df[i,][df[i,] != -1] 
    df2[i,1:length(x)] <- x 
    m <- max(m, length(x)) 
} 
df2 <- df2[, 1:m] 

colnames(df2) <- paste0("V", 1:m) 
df2 
# V1 V2 V3 V4 
# 1 2 6  
# 2 2   
# 3 4 3  
# 4 6 5 2 2 
Verwandte Themen