取消嵌套命令后如何在引号内提取列表数据

时间:2018-09-23 17:47:58

标签: r dplyr tidyr

首先,我必须更改我的问题(我无法发布新问题),所以我希望这个新问题将获得一些(+)票,以保持我在SO中发布的能力。向SO社区道歉,但我在这里尝试像其他所有人一样学习。 我有一个活动数据集,可用于为每个活动创建直方图。一列是“活动”,我需要从活动列中提取元素,但是它有2个变量-typeconfidence

>tail(df)
timestampMs                                                         activity
9104 1415996184265      IN_VEHICLE, UNKNOWN, ON_BICYCLE, STILL, 73, 23, 2, 2
9105 1415996140727                UNKNOWN, IN_VEHICLE, ON_BICYCLE, 71, 27, 2
9106 1415996055604                                              TILTING, 100
9107 1415995996249 UNKNOWN, ON_BICYCLE, ON_FOOT, UNKNOWN, IN_VEHICLE, STILL, 46, 25, 17, 17, 8, 4
9108 1415995854775                                              TILTING, 100
9109 1415995976124                                              TILTING, 100

我使用了lapply,它将列出并排列以下所示的值。

> df$activity <- lapply(df$activity, function(x) as.data.frame(t(x)))
> tail(df$activity)
[[1]]
                    1       2          3     4
type       IN_VEHICLE UNKNOWN ON_BICYCLE STILL
confidence         73      23          2     2
[[2]]
                 1          2          3
type       UNKNOWN IN_VEHICLE ON_BICYCLE
confidence      71         27          2

[[3]]
                 1
type       TILTING
confidence     100

[[4]]
                 1          2       3       4          5     6
type       UNKNOWN ON_BICYCLE ON_FOOT UNKNOWN IN_VEHICLE STILL
confidence      46         25      17      17          8     4

[[5]]
                 1
type       TILTING
confidence     100

然后我使用了unnest函数;

df2 <- df %>%
   transform(activity = str_split(activity, ",")) %>%
   unnest(activity)

它列出lapply中的所有元素,包括置信度变量(这是第4个元素)。

 timestampMs                        activity
 1415995996249       list(type = c("UNKNOWN"
 1415995996249                  "ON_BICYCLE"
 1415995996249                     "ON_FOOT"
 1415995996249                     "UNKNOWN"
 1415995996249                  "IN_VEHICLE"
 1415995996249                     "STILL")
 1415995996249            confidence = c(46
 1415995996249                           25
 1415995996249                           17
 1415995996249                           17
 1415995996249                            8
 1415995996249                          4))

我想要的是每个时间戳,它将列出类型(我使用的是相同的时间戳)。提取双引号内的值的最佳方法是什么,如果没有像最后6行这样的引号,我可以将其设置为N / A或空白,以便稍后对其进行过滤:

timestampMs            activity    
1415995996249         "UNKNOWN"
1415995996249      "ON_BICYCLE"
1415995996249         "ON_FOOT"
1415995996249         "UNKNOWN"
1415995996249      "IN_VEHICLE"
1415995996249           "STILL"

1 个答案:

答案 0 :(得分:0)

我知道我无法发布更多问题,尽管这个新更新的问题没有得到任何反馈,但是作为专业人士,这没关系。因此,我不是唯一可以提出问题的网站。我确实希望状态会在将来改变,因为我知道我可以做出贡献。无论如何,我仍然想分享一些细节。刚刚找到了一种自己unnest矩阵的方法,并且能够导出所需的输出。使用unnest(df$activity),然后在输出中应用melt函数以获取此表: 从此表中以宽格式显示:

> tail(df2) *#result of unnest*

       timestampMs       1          2       3       4          5     6    7
18213 1415995996249 UNKNOWN ON_BICYCLE ON_FOOT UNKNOWN IN_VEHICLE STILL <NA>
18214 1415995996249      46         25      17      17          8     4 <NA>
18215 1415995854775 TILTING       <NA>    <NA>    <NA>       <NA>  <NA> <NA>
18216 1415995854775     100       <NA>    <NA>    <NA>       <NA>  <NA> <NA>
18217 1415995976124 TILTING       <NA>    <NA>    <NA>       <NA>  <NA> <NA>
18218 1415995976124     100       <NA>    <NA>    <NA>       <NA>  <NA> <NA>

到此表并进行一些操作。

> tail(df3) *#result of melt*

          timestampMs   activity    value
 18213  1415995996249   1         UNKNOWN
 36431  1415995996249   2      ON_BICYCLE
 54649  1415995996249   3         ON_FOOT
 72867  1415995996249   4         UNKNOWN
 91085  1415995996249   5      IN_VEHICLE
109303  1415995996249   6           STILL
127521  1415995996249   7             NA