Mam dwusę (do testowania) tablicy kolumnowej (COLS) 10 rzędów. Na przykład. Cols.

       V243  V247
1   693   761
2  -733   791
3   665  -756
4    NA   892
5   821    NA
6   752   819
7  1092 -1137
8    NA   943
9   675   720
10  600   645

Chcę uzyskać jedną kolumnę 10 rzędu wektora z T lub F, jeśli dowolna kolumna zawiera na to w tym wierszu, a kolejna kolumna 10 rzędu wektora z T lub F, jeśli dowolna kolumna zawiera wartość <0 w tym wierszu. Chcę dostać:

na_column neg_column
F            F
F            T
F            T
T            F
T            F
F            F
F            T
T            F
F            F
F            F

Który (IS.NA (COLS)) zwraca 4, 8, 15. Zwraca listę indeksów dwóch tablicy kolumnowej, jakby został spłaszczony w jeden wiersz z kolumnami połączonych. Chcę, aby spojrzeć na każdy wiersz i jeśli jakakolwiek kolumna tego wiersza zawiera na, a następnie zwróć ten numer wiersza. Powinienem dostać 4, 5, 8.

Podobnie dla wartości ujemnej, potrzebuję 2, 3, 7. Jestem ze stratą, jak to zrobić. Wygląda na to, że powinno być łatwe w R.

r
0
John Wooten 4 czerwiec 2018, 16:52

3 odpowiedzi

Najlepsza odpowiedź

Wypróbuj tę opcję:

df <- data.frame(v1=c(1,NA,-3), v2=c(4,5,NA))
rowSums(!is.na(df)) < ncol(df)
[1] FALSE  TRUE  TRUE

as.logical(rowSums(df < 0, na.rm=TRUE))
[1] FALSE FALSE  TRUE

Dane:

  v1 v2
1  1  4
2 NA  5
3 -3 NA

Próbny

2
Tim Biegeleisen 4 czerwiec 2018, 14:26
df$na_column <- is.na(rowSums(df))
df$neg_column <- apply(df, 1, function(r) any(r < 0, na.rm = T))

df
#    V243  V247 na_column neg_column
# 1   693   761     FALSE      FALSE
# 2  -733   791     FALSE       TRUE
# 3   665  -756     FALSE       TRUE
# 4    NA   892      TRUE      FALSE
# 5   821    NA      TRUE      FALSE
# 6   752   819     FALSE      FALSE
# 7  1092 -1137     FALSE       TRUE
# 8    NA   943      TRUE      FALSE
# 9   675   720     FALSE      FALSE
# 10  600   645     FALSE      FALSE
2
C. Braun 4 czerwiec 2018, 14:00

any i all są funkcją w R, co chcesz. To jest łatwe w r

expl <- read.table(text="
          693   761
         -733   791
          665  -756
           NA   892
          821    NA
          752   819
         1092 -1137
           NA   943
          675   720
          600   645")

apply(expl, 1, function(x) any(is.na(x)))
apply(expl, 1, function(x) all(is.na(x)))
0
Bernhard 4 czerwiec 2018, 14:06