Найти имя столбца при изменении значения - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть такой набор данных (воспроизводимый)

X1 <- c(0,0,1,3)
X2 <- c(0,0,4,5)
X3 <- c(0,2,2,6)
X4 <- c(0,0,0,1)

df <- data.frame(rbind(X1, X2, X3, X4))
rownames(df) <- NULL
df

  X1 X2 X3 X4
1  0  0  1  3
2  0  0  4  5
3  0  2  2  6
4  0  0  0  1

Я хочу добавить столбец, который будет принимать значение имени столбца, где для каждой строки значение изменено с 0 на любое значение, большее 0

Следовательно, ожидаемый результат равен

  X1 X2 X3 X4 Value
1  0  0  1  3    X3
2  0  0  4  5    X3
3  0  2  2  6    X2
4  0  0  1  1    X4

Как мне добиться этого для каждой строки?

Ответы [ 3 ]

0 голосов
/ 13 ноября 2018

Другая опция, снова использующая apply:

names(df)[apply(df, 1, function(x) which(x > 0)[1])]
# [1] "X3" "X3" "X2" "X4"
0 голосов
/ 13 ноября 2018

A tidyverse решение:

df %>%
  rowid_to_column() %>% #Creating an ID
  gather(var, val, -rowid) %>% #Transforming the data from wide to long
  arrange(rowid) %>% #Arranging according ID
  group_by(rowid) %>% #Grouping by ID
  mutate(res = ifelse(cumsum(val) > 0, paste0(var), NA)) %>% #Applying the condition
  filter(res == first(res[!is.na(res)])) %>% #Selecting the relevant value
  left_join(df %>% rowid_to_column(), by = c("rowid" = "rowid")) %>% #Joining with the original df
  ungroup() %>% 
  select(-rowid, -var, -val) #Deleting the redundant variables

  res      X1    X2    X3    X4
  <chr> <dbl> <dbl> <dbl> <dbl>
1 X3       0.    0.    1.    3.
2 X3       0.    0.    4.    5.
3 X2       0.    2.    2.    6.
4 X4       0.    0.    0.    1.
0 голосов
/ 13 ноября 2018

Векторизованный способ сделать это будет:

names(df)[max.col(df != 0, ties.method = 'first')]
#[1] "X3" "X3" "X2" "X4"

Кроме того, вы можете использовать apply с полем 1 (для выполнения операций со строками) и найти первый индекс, где diffне 0, то есть

names(df)[apply(df, 1, function(i) which(diff(i) != 0)[1]) + 1]
#[1] "X3" "X3" "X2" "X4"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...