从特定的 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
格热戈日
我在这里回答了一个类似的问题:
但是,我 运行 遇到了一个更具体的问题。这是我编辑的数据框:
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
格热戈日