R dplyr: изменить значение строки столбцов, имеющих конкретное имя - PullRequest
0 голосов
/ 24 августа 2018

У меня есть фрейм данных.В одном из столбцов есть строковые значения, которые я хочу использовать в качестве условия для имени других столбцов.Например,

df <- data.frame(
  cond=c("a","b"),
  aVal=c(1  , 2),
  bVal=c(3  , 4)
)

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

#    cond aVal bVal
# 1    a    1    0
# 2    b    0    4

Я не уверен, как это сделать с R, предпочтительно с dplyr.

Ответы [ 3 ]

0 голосов
/ 24 августа 2018
library(tidyverse)
df <- data.frame(
  cond=c("a","b"),
  aVal=c(1  , 2),
  bVal=c(3  , 4)
)

gather(df, col1, col2, -cond) %>% 
  as.tibble() %>% 
  filter(str_sub(col1, 1, 1) == cond) %>% 
  spread(col1, col2) %>%
  mutate_at(vars(contains('Val')),
            funs(replace(., is.na(.), 0)))

# A tibble: 2 x 3
  cond   aVal  bVal
  <fct> <dbl> <dbl>
1 a         1     0
2 b         0     4
0 голосов
/ 24 августа 2018

Вот вариант base R

df[-1] <- df[-1] * t(apply(df, 1, function(x)  substr(names(x)[-1], 1, 1) == x[1]))
df
#   cond aVal bVal
#1    a    1    0
#2    b    0    4

Также вариант выше будет

df[-1] * (substr(matrix(names(df)[-1][row(df[-1])], 2, 2), 1, 1) == 
               df$cond[col(df[-1])])
0 голосов
/ 24 августа 2018

Вот решение tidyverse.Обратите внимание, что я использовал stringsAsFactors = FALSE, чтобы создать пример фрейма данных для избежания факторных столбцов.df2 - конечный результат.

library(tidyverse)

df2 <- df %>%
  gather(Column, Value, -cond) %>%
  mutate(Column2 = str_sub(Column, 1, 1)) %>%
  mutate(Value = ifelse(map2_lgl(cond, Column2, ~str_detect(.y, .x)), Value, 0)) %>%
  select(-Column2) %>%
  spread(Column, Value)
df2
#   cond aVal bVal
# 1    a    1    0
# 2    b    0    4

Данные

df <- data.frame(
  cond=c("a","b"),
  aVal=c(1  , 2),
  bVal=c(3  , 4),
  stringsAsFactors = FALSE
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...