更新:我对此进行了重新措辞和重新思考,我认为最好是这样问这个问题。
所以我一直在这方面做事很运气,没有运气。这是我要做什么的一个例子。
我从一个数据帧开始:
df = data.frame("one" = c(1,11), "two" = c(2,22), "three" = c(3,33))
one two three
1 2 3
11 22 33
我正在尝试将以上内容变成这样:
one new
1 c(2,3)
11 c(22,33)
我已经尝试了一些事情,例如嵌套2列并尝试在它们上进行映射等。也许有些简单的事情我在这里没有看到。我更希望通过tidyverse在R中做到这一点,但在这一点上我愿意接受任何事情。
必须这样,因为当将其转换为JSON时,“ new”下的值必须为[1,2,3]和[11,22,33]形式。也许在Python中更容易?
我正在R中使用 jsonlite 包来进行JSON的转换。
感谢您的帮助。
答案 0 :(得分:2)
我认为这应该只是一次Map
练习:
df$new <- Map(c, df$two, df$three)
df
# one two three new
#1 1 2 3 2, 3
#2 11 22 33 22, 33
library(jsonlite)
toJSON(df[c("one","new")])
#[{"one":1,"new":[2,3]},{"one":11,"new":[22,33]}]
如果您有很多变量,也可以将其包装在do.call
中以完成操作:
df$new <- do.call(Map, c(c,df[2:3]))
如果 tidyverse 是您的喜好,则可以 purrr 如下:
map2(df$two, df$three, c)
答案 1 :(得分:1)
在python中,使用pandas
:
import pandas as pd
df = pd.DataFrame([[1,2,3],[11,22,33]], columns=["one", "two","three"])
one two three
0 1 2 3
1 11 22 33
df['new'] = list(zip(df.two, df.three))
df[['one','new']].to_json(orient='records')
# '[{"one":1,"new":[2,3]},{"one":11,"new":[22,33]}]'
答案 2 :(得分:1)
在tidyr::nest()
之后,您可以在R中使用group_by()
:
library(dplyr)
nest_df <- df %>%
group_by(one) %>%
tidyr::nest(c(two, three), .key="new")
# # A tibble: 2 x 2
# one new
# <dbl> <list>
# 1 1 <tibble [1 x 2]>
# 2 11 <tibble [1 x 2]>
现在列new
的每一行中是tibble()
。
nest_df[1, ][[2]]
# # A tibble: 1 x 2
# two three
# <dbl> <dbl>
# 1 2 3
toJSON()
:
df %>%
group_by(one) %>%
tidyr::nest(c(two, three), .key="new") %>%
jsonlite::toJSON()
#[{"one":1,"new":[{"two":2,"three":3}]},{"one":11,"new":[{"two":22,"three":33}]}]