Как использовать таблицу подстановки в R без создания дубликатов?

мне было интересно, есть ли у кого-то хороший способ достичь этого. У меня есть фрейм данных, где каждое наблюдение (=item), принадлежащее определенной группе (=condition), имеет заданное значение:

# Create sample data.
item       = rep(1:3,2)                               #6 items
condition  = c(rep("control",3), rep("related",3))    #2 conditions
value      = c(10,11,12,20,21,22)                     #6 values          
df         = data.frame(item, condition, value)

  item condition value
1    1   control    10
2    2   control    11
3    3   control    12
4    1   related    20
5    2   related    21
6    3   related    22

у меня также есть таблица поиска, которая содержит среднее значение каждой группы:

# Create lookup table.
condition  = c("control", "related")
mean       = c(11,21)
table      = data.frame(condition, mean)

  condition mean
1   control   11
2   related   21

Я хочу изменить свой исходный фрейм данных, таким образом, что он содержит новый столбец,label, который говорит:"низкий" если значение элемента меньше, чем группа означает, и"высокий" в противном случае. это должно выглядеть так:

# How the output should look like.
# If the item value is less than the group mean, write "low". Write "high" otherwise.
item       = rep(1:3,2)                               
condition  = c(rep("control",3), rep("related",3))    
value      = c(10,11,12,20,21,22)                      
label      = c(rep(c("low", "high", "high"),2))
output     = data.frame(item, condition, value, label)

  item condition value label
1    1   control    10   low
2    2   control    11  high
3    3   control    12  high
4    1   related    20   low
5    2   related    21  high
6    3   related    22  high

если бы это было просто копирование группы mean в мой исходный фрейм данных, я бы использовал merge. Но мне нужно принять во внимание среднее значение группы, чтобы написать новую метку для каждого элемента, который говорит"низкий" или "высокий " в зависимости от среднего значения группы.

одна вещь, которую я попытался было сначала слить мой фрейм данных с таблицей, а затем использовать ifelse сравнить стоимостью С mean. Это работает, но я также получаю mean столбец в моем фрейме данных, который мне не нужен (мне нужен только метка). Конечно, я мог бы удалить mean колонка вручную, но она кажется неуклюжей. Поэтому мне было интересно: кто-то знает лучшее/более элегантное решение?

спасибо!

1 ответов


вот некоторые альтернативы. (1) и (2) Используйте только базу R и (2), (3) и (5) Не создавайте средний столбец только для явного удаления. В (1), (3) и (4) мы использовали левые соединения, хотя внутренние соединения дали бы тот же результат с этими данными и в случае (1a) позволяют писать (1) как одну строку.

1) слияния

m <- merge(df, table, all.x = TRUE)
transform(m, label = ifelse(value < mean, "low", "high"), mean = NULL)

даем:

  item condition value label
1    1   control    10   low
2    2   control    11  high
3    3   control    12  high
4    1   related    20   low
5    2   related    21  high
6    3   related    22  high

1А) С внутренним соединением он может быть сокращен кому:

transform(merge(df, table), label = ifelse(value < mean, "low", "high"), mean = NULL)

2 матч)

transform(df, 
  label = ifelse(value < table$mean[match(condition, table$condition)], "low", "high")
)

давать то же самое.

3) sqldf

library(sqldf)
sqldf("select 
         df.*, 
         case when value < mean 
              then 'low' 
              else 'high' 
              end label
       from df 
       left join 'table' using (condition)")

4) dplyr

library(dplyr)
df %>%
   left_join(table) %>%
   mutate(label = ifelse(value < mean, "low", "high")) %>%
   select(- mean)

5) данных.таблица

library(data.table)
dt <- as.data.table(df)
setkey(dt, "condition")
dt[table, label := ifelse(value < mean, "low", "high")]