Как умножить переменные на место в кадре данных длинного формата? - PullRequest
1 голос
/ 08 мая 2020

В кадре данных с длинным форматом, например diamonds:

 carat cut       color clarity depth table price     x     y     z
  <dbl> <ord>     <ord> <ord>   <dbl> <dbl> <int> <dbl> <dbl> <dbl>
1 0.23  Ideal     E     SI2      61.5    55   326  3.95  3.98  2.43
2 0.21  Premium   E     SI1      59.8    61   326  3.89  3.84  2.31
3 0.23  Good      E     VS1      56.9    65   327  4.05  4.07  2.31
4 0.290 Premium   I     VS2      62.4    58   334  4.2   4.23  2.63
5 0.31  Good      J     SI2      63.3    58   335  4.34  4.35  2.75
6 0.24  Very Good J     VVS2     62.8    57   336  3.94  3.96  2.48

Как я могу, например, умножить каждое значение в столбце price на константу, где каждая строка в * Столбец 1006 * удовлетворяет условию clarity='SI2'?

Я знаю, как использовать filter для фильтрации фрейма данных и выполнять любую операцию, которая мне нравится:

df1 <- diamonds
filter(df['price'], df['clarity']=='VS1')*1000

# output:
price
<dbl>
327000              
338000              
340000              
353000              
355000              
357000              
402000              
402000              
402000              
402000  

Но как мне заменить старые значения с пересчитанными значениями в одном go?

Я был уверен , это будет работать нормально:

df['price'][df$clarity == 'VS1'] <- filter(df['price'], df['clarity']=='VS1')*1000

Но я получаю сообщение об ошибке: Error: Must assign to columns with a valid subscript vector

Я давно не баловался с R, поэтому боюсь, что могу упустить что-то очень очевидное. Спасибо за любые предложения!

Ответы [ 3 ]

4 голосов
/ 08 мая 2020

Если вам нужна модификация на месте, data.table может быть тем, что вы ищете:

library(data.table)
setDT(df)
df[clarity == 'VS1', price := price*1000]

Следовательно, вы изменили значения на месте

1 голос
/ 08 мая 2020

Мы можем использовать case_when

library(dplyr)
df %>%
  mutate(price = case_when(clarity == 'VS1' ~ price * 1000, TRUE ~ price))
1 голос
/ 08 мая 2020

Вы можете получить индекс, в котором вы хотите заменить значения и умножить только эти значения на 1000. Это можно сделать в базе R следующим образом:

inds <- df$clarity == 'VS1'
df$price[inds] <- df$price[inds] * 1000

Или в data.table:

library(data.table)
setDT(df)[clarity == 'VS1', price := price * 100]

Немного неэффективным решением будет ifelse / if_else

library(dplyr)
df %>% mutate(price = if_else(clarity == 'VS1', price * 1000, price))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...