R组合具有不同行长度的向量

R组合具有不同行长度的向量,r,R,如何将不同数量或行的向量组合到R中的数据帧中。以下是示例。每个向量有7或9行。sourceVersion和device是另外两行。我希望这些数据包含在数据框中,对于7行向量观测,留空或设置为NA,如下表所示 我希望数据在这样的数据框中 type sourceName sourceVersion device

如何将不同数量或行的向量组合到R中的数据帧中。以下是示例。每个向量有7或9行。sourceVersion和device是另外两行。我希望这些数据包含在数据框中,对于7行向量观测,留空或设置为NA,如下表所示

我希望数据在这样的数据框中

type                                    sourceName              sourceVersion   device                                                                                                          unit    creationDate    startDate       endDate         value
HKQuantityTypeIdentifierFlightsClimbed  Ryan Praskievicz iPhone 9.3.2           <<HKDevice: 0x15a4af3f0>, name:iPhone, manufacturer:Apple, model:iPhone, hardware:iPhone8,1, software:9.3.2>    count   6/2/2016 12:27  6/2/2016 12:09  6/2/2016 12:09  1
HKQuantityTypeIdentifierStepCount       Ryan Praskievicz iPhone                                                                                                                                 count   10/2/2014 8:30  9/24/2014 15:07 9/24/2014 15:07 7
键入sourceName sourceVersion设备单元creationDate startDate endDate值
HKQuantityTypeIdentifierLightsLimbed Ryan Praskievicz iPhone 9.3.2 count 6/2/2016 12:27 6/2/2016 12:09 6/2/2016 12:09 1
HKQuantityTypeIdentifierStepCount Ryan Praskievicz iPhone count 10/2/2014 8:30 9/24/2014 15:07 9/24/2014 15:07 7
这就是我尝试过的

library(XML)

xmlstr <- '<?xml version="1.0" encoding="UTF-8"?>
            <HealthData locale="en_US">
              <ExportDate value="2016-06-02 14:05:23 -0400"/>
              <Me HKCharacteristicTypeIdentifierDateOfBirth="" HKCharacteristicTypeIdentifierBiologicalSex="HKBiologicalSexNotSet" HKCharacteristicTypeIdentifierBloodType="HKBloodTypeNotSet" HKCharacteristicTypeIdentifierFitzpatrickSkinType="HKFitzpatrickSkinTypeNotSet"/>
              <Record type="HKQuantityTypeIdentifierStepCount" sourceName="Ryan Praskievicz iPhone" unit="count" creationDate="2014-10-02 08:30:17 -0400" startDate="2014-09-24 15:07:06 -0400" endDate="2014-09-24 15:07:11 -0400" value="7"/> <Record type="HKQuantityTypeIdentifierFlightsClimbed" sourceName="Ryan Praskievicz iPhone" sourceVersion="9.3.2" device="&lt;&lt;HKDevice: 0x15a4af3f0&gt;, name:iPhone, manufacturer:Apple, model:iPhone, hardware:iPhone8,1, software:9.3.2&gt;" unit="count" creationDate="2016-06-02 12:27:46 -0400" startDate="2016-06-02 12:09:29 -0400" endDate="2016-06-02 12:09:29 -0400" value="1"/> </HealthData>'

xml <- xmlParse(xmlstr)

recordAttribs <- xpathSApply(doc=xml, path="//HealthData/Record",  xmlAttrs)
df <- data.frame(t(recordAttribs))
df
库(XML)

xmlstr这里有一种使用
sapply
lapply
的方法

recordAttribs <- xpathSApply(doc=xml, path="//HealthData/Record",  xmlAttrs)

recordAttribs <- t(recordAttribs)
对满足此条件的列表子集使用
lappy
。这一次,您将在满足上述条件的向量中连接两个
NA

recordAttribs[short.condition] <- lapply(recordAttribs, 
                                         function(x) c(x[1:2],NA,NA,x[3:7]))

recordAttribs[short.condition]这里有一种使用
sapply
lapply
的方法

recordAttribs <- xpathSApply(doc=xml, path="//HealthData/Record",  xmlAttrs)

recordAttribs <- t(recordAttribs)
对满足此条件的列表子集使用
lappy
。这一次,您将在满足上述条件的向量中连接两个
NA

recordAttribs[short.condition] <- lapply(recordAttribs, 
                                         function(x) c(x[1:2],NA,NA,x[3:7]))

recordAttribs[short.condition]依赖关系有点深奥,但您可以:

library(data.table)
rbindlist(lapply(recordAttribs, function(x) data.table(t(x))), fill=TRUE)
这将返回一个
data.table
,它继承
data.frame

                                     type              sourceName  unit
1:      HKQuantityTypeIdentifierStepCount Ryan Praskievicz iPhone count
2: HKQuantityTypeIdentifierFlightsClimbed Ryan Praskievicz iPhone count
                creationDate                 startDate                   endDate value
1: 2014-10-02 08:30:17 -0400 2014-09-24 15:07:06 -0400 2014-09-24 15:07:11 -0400     7
2: 2016-06-02 12:27:46 -0400 2016-06-02 12:09:29 -0400 2016-06-02 12:09:29 -0400     1
   sourceVersion
1:            NA
2:         9.3.2
                                                                                                         device
1:                                                                                                           NA
2: <<HKDevice: 0x15a4af3f0>, name:iPhone, manufacturer:Apple, model:iPhone, hardware:iPhone8,1, software:9.3.2>

依赖关系有点深奥,但您可以:

library(data.table)
rbindlist(lapply(recordAttribs, function(x) data.table(t(x))), fill=TRUE)
这将返回一个
data.table
,它继承
data.frame

                                     type              sourceName  unit
1:      HKQuantityTypeIdentifierStepCount Ryan Praskievicz iPhone count
2: HKQuantityTypeIdentifierFlightsClimbed Ryan Praskievicz iPhone count
                creationDate                 startDate                   endDate value
1: 2014-10-02 08:30:17 -0400 2014-09-24 15:07:06 -0400 2014-09-24 15:07:11 -0400     7
2: 2016-06-02 12:27:46 -0400 2016-06-02 12:09:29 -0400 2016-06-02 12:09:29 -0400     1
   sourceVersion
1:            NA
2:         9.3.2
                                                                                                         device
1:                                                                                                           NA
2: <<HKDevice: 0x15a4af3f0>, name:iPhone, manufacturer:Apple, model:iPhone, hardware:iPhone8,1, software:9.3.2>

首先,您正在尝试绑定具有不同列数的行,而不是绑定具有不同行数的列。也就是说,一般来说,您不会有列对齐问题吗?也就是说,如果一行的列数比另一行少,除非你能从数据中推断出,否则你怎么知道缺少了哪些列?@aichao似乎缺少了相同的两行-sourceVersion和device@aichao是的,正如warner所建议的一样,缺少了相同的两行可以满足你的需要吗?首先,您正在尝试绑定具有不同列数的行,而不是绑定具有不同行数的列。也就是说,一般来说,您不会有列对齐问题吗?也就是说,如果一行的列数少于另一行,除非你能从数据中推断出,否则你怎么知道缺少了哪些列?@aichao似乎缺少了相同的两行-sourceVersion和device。@aichao是的,正如warner建议的一样,缺少了相同的两行谢谢你的回答,但这不正是我要找的。我想要数据帧中的数据,就像我问题中的第一个表格“我想要这样的数据帧中的数据。”@RyanPraskievicz我编辑了我的答案来解释这一点。这不是最好的解决办法。我假设你的7行观察将缺少相同的两列。@RyanPraskievicz又做了一次编辑,将输出放入有用的data.frame中。谢谢你的回答,但这不是我想要的。我想要数据帧中的数据,就像我问题中的第一个表格“我想要这样的数据帧中的数据。”@RyanPraskievicz我编辑了我的答案来解释这一点。这不是最好的解决办法。我假设你的7行观察将缺少相同的两列。@RyanPraskievicz又做了一次编辑,将输出放入有用的data.frame中。非常感谢!当我尝试运行
df@RyanPraskievicz时,请尝试上面编辑的
rbindlist
。如果
lappy
真的拖累了你,你可能想看看
multi-core::mclappy
这非常有效,谢谢!当我尝试运行
df@RyanPraskievicz时,请尝试上面编辑的
rbindlist
。如果
lappy
真的拖累了你,你可能想看看
multicore::mclappy
d1 = data.table(a="foo", b = "bar", c = "baz")
d2 = data.table(b="bar", a = "foo")
rbind(d1, d2) # throws helpful error:  "If instead you need to fill missing columns, use set argument 'fill' to TRUE."
rbind(d1, d2, fill=TRUE)
#      a   b   c
# 1: foo bar baz
# 2: foo bar  NA