как использовать "для l oop '" в dataframe в r - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь рассчитать общую стоимость для Китая и США, используя для l oop:

Пожалуйста, обратитесь ниже образец фрейма данных и код:

z <- data.frame(location = c("china", "china", "US", "US" ), quantity = c(100, 200, 100, 200))

## Calculate Total price, considering price for one quanity is $1 for china and $3 for US

for row in 1:nrow(z) {

  l <- z[row, "location"]

  q <- z[row, "quanity"]

  ifelse (l == "china", 

          z$total <- (z$quantity * 1),

          z$total <- (z$quantity * 3)) 

Ответы [ 4 ]

3 голосов
/ 07 января 2020

В R большую часть времени вы можете обойтись без петель. Если у вас есть только 2 местоположения, как показано, то в этом случае вы также можете обойтись с ifelse. Попробуйте

transform(z, total = quantity * c(1, 3)[(location != "china") + 1])

#  location quantity total
#1    china      100   100
#2    china      200   200
#3       US      100   300
#4       US      200   600

Если у вас есть несколько таких стран, вы также можете использовать case_when из dplyr

library(dplyr)
z %>%
  mutate(total = case_when(location == "china"~quantity, 
                           location == "US"~quantity * 3, 
                           ....more countries))
2 голосов
/ 07 января 2020

Вам вообще не нужно al oop

library(dplyr)

z <- data.frame(location = c("china", "china", "US", "US" ),
                quantity = c(100, 200, 100, 200))


z %>% group_by(location) %>%
  summarise(sum_quantity = quantity %>% sum) %>% 
  mutate(total = if_else(location == 'china',
                                sum_quantity,
                                sum_quantity * 3))
#> # A tibble: 2 x 3
#>   location sum_quantity total
#>   <fct>           <dbl> <dbl>
#> 1 china             300   300
#> 2 US                300   900


# the ideal world

new_z <- data.frame(location = c("china", "china", "US", "US" ),
                quantity = c(100, 200, 100, 200),
                value_rate = c(1,1,3,3))

new_z %>% group_by(location) %>%
  summarise(sum_quantity = (quantity * value_rate) %>% sum)
#> # A tibble: 2 x 2
#>   location sum_quantity
#>   <fct>           <dbl>
#> 1 china             300
#> 2 US                900

Создано в 2020-01-07 пакетом Представить (v0.3.0)

1 голос
/ 07 января 2020

Другое базовое решение R заключается в использовании ifelse, как показано ниже:

z <- within(z,total <- quantity*ifelse(location=="china",1,3))

, так что

> z
  location quantity total
1    china      100   100
2    china      200   200
3       US      100   300
4       US      200   600
1 голос
/ 07 января 2020

Я согласен с другими ответами, что в данной конкретной ситуации a для l oop, вероятно, является чрезмерным убийством, а ниже я попытаюсь дать вам решение по тививеру. Однако, если вы хотите придерживаться парадигмы al oop, посмотрите на Для каждой строки в R-фрейме данных

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(magrittr)
z <- data.frame(location = c("china", "china", "US", "US" ), quantity = c(100, 200, 100, 200))
z %>% 
  mutate(price = ifelse(location == "china", 1, 3)) %>% 
  group_by(location) %>% 
  summarise(total = sum(quantity * price))
#> # A tibble: 2 x 2
#>   location total
#>   <fct>    <dbl>
#> 1 china      300
#> 2 US         900

Создано в 2020-01-07 путем представительный пакет (v0.3.0.9000)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...