我有一个数据框,其中每一行应主要包含“无响应”值(-1
)。我想获取不是-1
的每一行的第一个值,最好使用整洁的东西。
# A tibble: 3,222 x 10
tracc1 tracc2 tracc3 tracc4 tracc5 tracc6 tracc7 tracc8 tracc9 tracc10
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 1 -1 -1 -1 -1 -1 7 -1 -1 -1
2 1 -1 -1 -1 -1 -1 -1 -1 -1 -1
3 1 -1 -1 -1 -1 -1 -1 -1 -1 -1
4 1 -1 -1 -1 -1 -1 -1 -1 -1 -1
5 1 -1 -1 -1 -1 -1 -1 -1 -1 -1
6 1 -1 -1 -1 -1 -1 -1 -1 -1 -1
7 1 -1 -1 -1 -1 -1 -1 -1 -1 -1
8 1 -1 -1 -1 -1 -1 -1 -1 -1 -1
9 -1 -1 3 -1 -1 -1 -1 -1 -1 -1
10 1 -1 -1 -1 -1 -1 -1 -1 -1 -1
# ...
我能够使用dpylr::unite
合并所有列,但是当单个行具有多个有效响应时会出现问题。在下面的示例中,第一行应产生1
而不是17
。
> df %>%
mutate_at(vars(starts_with("tracc")),
function(t) {if_else(t < 0,"",t)}) %>%
unite("tracc",starts_with("tracc"),sep = "", na.rm = TRUE)
# A tibble: 3,222 x 1
tracc
<chr>
1 17
2 1
3 1
4 1
5 1
6 1
7 1
8 1
9 3
10 1
# ...
答案 0 :(得分:7)
尝试以下简单代码:
apply(df, 1, function(x) x[x != -1][1])
它并行地应用于每一行。
答案 1 :(得分:5)
一个dplyr
选项可能是:
df %>%
mutate_all(~ replace(., . == "-1", NA_integer_)) %>%
transmute(tracc = coalesce(!!!.))
tracc
1 1
2 1
3 1
4 1
5 1
6 1
7 1
8 1
9 3
10 1
答案 2 :(得分:2)
使用dplyr
library(dplyr)
df %>% mutate(row_num = row_number()) %>% # add column with row number
pivot_longer(-row_num,names_to='tracc') %>% # pivot to get three columns
mutate(tracc=as.numeric(str_replace(tracc,'tracc',''))) %>% # convert tracc to numeric
filter(value != -1) %>% # keep only -1 values
arrange(tracc) %>% # sort by tracc
group_by(row_num) %>%
filter(row_number()==1) # keep first -1 value by row_num
# A tibble: 10 x 3
# Groups: row_num [10]
# row_num tracc value
# <int> <dbl> <int>
# 1 1 1 1
# 2 2 1 1
# 3 3 1 1
# 4 4 1 1
# 5 5 1 1
# 6 6 1 1
# 7 7 1 1
# 8 8 1 1
# 9 10 1 1
#10 9 3 3
答案 3 :(得分:2)
我们可以将向量化选项与row/column
索引一起使用
df[cbind(seq_len(nrow(df)), max.col(df != -1, 'first'))]