从特定的 R 数据框列添加动态 JSON 列

Adding a dynamic JSON column from specific R dataframe columns

我在这里回答了一个类似的问题:

但是,我 运行 遇到了一个更具体的问题。这是我编辑的数据框:

df <- data.frame(item = c("Box 1", "Box 2", "Box 3"), Length = c(2, 4, 6), Width = c(4,5,3), Height  = c(6, 4, 3), Price = c(0.39, 0.78, NA))

我想要这个结果:

   item Length Width Height  item_dimensions_price
1 Box 1      2     4      6   {"size":"2 x 4 x 6","price":"0.39"}
2 Box 2      4     5      4   {"size":"4 x 5 x 4","price":"0.78"}
3 Box 3      6     3      3   {"size":"6 x 3 x 3"}

在这种情况下,如果价格条目为 NA,我需要 JSON 列不打印价格。

这是我当前的代码:

df %>%
  rowwise() %>%
  mutate(item_dimensions = toJSON(list(
    size = paste(Length, Width, Height, sep = " x "),
    price = paste(Price[!is.na(Price)], sep = ",")
  ), auto_unbox = T))

但结果不是我想要的,因为尽管条目为空,但它打印出“价格”。 我需要它是动态的,价格列中的 NA 不会在 item_dimensions JSON 列中打印“价格”。

  item  Length Width Height Price item_dimensions                    
  <chr>  <dbl> <dbl>  <dbl> <dbl> <json>                             
1 Box 1      2     4      6  0.39 {"size":"2 x 4 x 6","price":"0.39"}
2 Box 2      4     5      4  0.78 {"size":"4 x 5 x 4","price":"0.78"}
3 Box 3      6     3      3 NA    {"size":"6 x 3 x 3","price":[]}   

ifelse 在这种情况下有帮助

df <- df %>%
  rowwise() %>%
  mutate(item_dimensions = ifelse(   #ifelse is your friend
    !is.na(Price),
    toJSON(list(
      size = paste(Length, Width, Height, sep = " x "),
      price = paste(Price, sep = ",")
    ),
    auto_unbox = T),
    toJSON(list(size = paste(
      Length, Width, Height, sep = " x "
    )),
    auto_unbox = T)
  ))

> df
#
# A tibble: 3 × 6
# Rowwise: 
  item  Length Width Height Price item_dimensions                              
  <chr>  <dbl> <dbl>  <dbl> <dbl> <chr>                                        
1 Box 1      2     4      6  0.39 "{\"size\":\"2 x 4 x 6\",\"price\":\"0.39\"}"
2 Box 2      4     5      4  0.78 "{\"size\":\"4 x 5 x 4\",\"price\":\"0.78\"}"
3 Box 3      6     3      3 NA    "{\"size\":\"6 x 3 x 3\"}"   

> validate(as.character(df[1,6]))
[1] TRUE

格热戈日