R - Zählung in jeder Zeile die Anzahl der Spalten in der Zeile Nachbarschaft", die nur NA
Wie würden Sie erstellen ein Daten-frame einen Vektor, der für jede Zeile die Anzahl der Spalten, "NA" (oder einen benutzerdefinierten Wert) in dieser Zeile und die n Zeilen oben und m Zeilen weiter unten.
Also, wenn m = n = 1 (d.h., wie vielen Spalten in jeder Zeile sind NA und NA unmittelbar vor und nach) und mein dataframe ist
structure(list(X = 1:8, A = c(3L, NA, 10L, NA, 6L, NA, 5L, NA
), B = c(6L, NA, NA, NA, 8L, NA, 13L, NA), C = c(NA, 12L, 14L,
NA, NA, NA, 9L, NA), D = c(NA, NA, NA, NA, NA, 11L, 7L, NA)), .Names = c("X",
"A", "B", "C", "D"), class = "data.frame", row.names = c(NA,
-8L))
d.h.
t X A B C D
1 1 3 6 NA NA
2 2 NA NA 12 NA
3 3 10 NA 14 NA
4 4 NA NA NA NA
5 5 6 8 NA NA
6 6 NA NA NA 11
7 7 5 13 9 7
8 8 NA NA NA NA
Möchte ich den Vektor
count
0
1
2
1
1
0
0
0
(wenn die ersten und letzten Einträge sind NA
's, das ist in Ordnung). Ich bin versucht zu imitieren eine COUNTIFS
Funktion in Excel, d.h. COUNTIFS(B2:F2,"",B3:F3,"",B4:F4,"")
für Zeile 3.
- Ich verstehe nicht, wie deine Beschreibung erzeugt das gewünschte Ergebnis. Wie kommt es, dass Graf hat 1 in Zeile 2?
- Spalte D hat eine NA in Zeile 2 und in den Zeilen 1 und 3. Die anderen Spalten nicht, so
count
ist 1 gibt. - Ich glaube, was Sie meinen, ist: nehmen wir an, wir betrachten Zeile
i
Spaltej
: wenn Spaltej
hat NAs für dien
Zeilen vor undm
Zeilen nach der Zeilei
zählen wir es. Also für die zweite Reihe, nur dieNA
in der 'D' - Spalte hat eineNA
unmittelbar oberhalb und unterhalb es. - Ja, mathematischen.Kaffee ist korrekt.
- könnte ich eine Klarstellung - in der Zeile 1 die NA in Spalte D die NA, nachdem Sie, aber keiner vor, weil es keine vorherigen Zeile - Sie wollen diese auf 0 zurück, immer? (d.h. die ersten und letzten Elemente Ihrer
count
Vektor immer 0?) - Return 0 oder
NA
, aber ich bin nicht viel Aufhebens. Der "wahre" Wert in dieser Zeile ist, dass der Zustand ist bedeutungslos, aber ich bin wohl mit 0. Für höhere m oder n das gleiche gilt für die ersten n und die letzten m Zeilen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich denke, dass ich bekomme, was du meinst.
Vermute, dass der dataframe heißt
x
.Erste, für jede (
row
,colum
n) inx
müssen wir sehen, ob es eineNA
in die Zelle, UND einNA
im gleichen Spalte für dien
Zeilen vor undm
Zeilen nach.Erste, lassen Sie uns dies tun im Fall einer einzelnen Zeile, Zeile
i = 2
sagen.Wir haben auch
n = 1
undm = 1
(aus dem Beispiel in der Frage).Lassen Sie uns zählen Sie die Anzahl der NAs in jeder Spalte für die Zeilen
i - n
zui + m
inclusive (is.na
zurückTRUE
wenn der aktuelle Wert NA,colSums
gibt Spalte Summen)Jetzt haben wir nur noch eine
NA
in der früheren, die aktuelle und die nächste Zeile, wenn wir gezählt 3NA
s (d.h. nur in der Spalte D qualifiziert hier):also die Anzahl von Spalten, erfüllen unsere Kriterien (daher der
i
te element des output):Dann verwenden wir
sapply
für diesen über jede Zeile:Du hast auch erwähnt, dass Sie vielleicht vergleichen wollen, um einen benutzerdefinierten Wert eher als
NA
. In diesem Fall, anstatt das zu tunis.na(x[...])
können Sie nur tunx[...] == value
(aber nicht, wennvalue
istNA
, in dem Sieis.na
)Auch, das Sie retten könnte ein bisschen Arbeit, nur mit
sapply
auf Zeilenn + 1
zunrow(df) - m - 1
und Einstellung der erstenn
und letztenm
Elemente automatisch auf 0.Diese sollten die erwünschten Ergebnis -
m
undn
:rowSums(y & rbind(matrix(FALSE, nrow = m, ncol = 5), y[-((length(yourDataFrame)-(m-1)):length(yourDataFrame)),]) & rbind(y[-(1:n),], matrix(FALSE, nrow = n, ncol = 5)))
n
Zeilen vor undm
Zeilen nach ist NA, nicht dort, wo alle Zeilen ausn
vorm
nach sind NA - (in dieser Spalte). Wirklich wie die Glattheit dieser Antwort aber leider nicht skalieren, um beliebigen
undm
Hier ist eine Funktion, die Ermittlung der
NA
Werte in der Mitte einer Auflage vonlength = .length
Wir können diese mit rowSums und
sapply
zu bekommen, was Sie wollen.ohne das Rad neu erfinden (etwas rollt)
Oder verwenden Sie
rollapply
von derzoo
Paketoder auch nur
xx
den Daten-frame?Ich konnte nicht kommen, mit eine vektorisierte version, so ist hier eine gute alte for-Schleife:
Dies sollte den trick tun (auch mit so dass für n und m):
Beachten Sie, dass ich mit zwei tricks. Wie die Arbeit mit
NA
s ist etwas problematisch ich den Austausch mit-99
(obwohl, das ist nicht absolut notwendig). Dann weiß ich nicht Schleife über die ersten n und die letzten m Zeilen.Wenn jemand eine vektorisierte version, die er/Sie erhält auf jeden Fall mein upvote.
m
undn
hier ist nicht korrekt. verwendenrollapply
statt.Können Sie
describe
nur um die Anzahl der NAs in jeder Spalte.Die Ausgabe sieht wie folgt aus:
Check für
missing
Werte.