【问题标题】:extracting numbers of certain length from list从列表中提取一定长度的数字
【发布时间】:2016-04-13 11:37:01
【问题描述】:

我有一个包含数千个元素的列表——一些元素包含年份——它们是 4 个数字的字符串——其他元素包含我需要删除的随机数。

我只需要从列表中提取长度为 4 的数字,并删除所有其他数字。最后,我需要一个包含 20 行的数据框和包含嵌套在列表中的年份的列。例如,在下面的示例中,我需要一个看起来像这样的表。

> sample_years
   element year year.1 year.2 year.3
1        1   NA     NA     NA     NA
2        2   NA   1918     NA     NA
3        3   NA     NA     NA     NA
4        4   NA     NA     NA     NA
5        5   NA   1912   1913     NA
6        6   NA   1893   1898   1925
7        7   NA   1820   1830   1899
8        8   NA     NA     NA     NA
9        9   NA   1808   1810   1854
10      10   NA     NA     NA     NA
11      11   NA     NA     NA     NA
12      12   NA   1885     NA     NA
13      13   NA   1900     NA     NA
14      14   NA   1926   1933     NA
15      15   NA     NA     NA     NA
16      16   NA     NA     NA     NA
17      17   NA   1870     NA     NA
18      18   NA     NA   1923     NA
19      19   NA     NA     NA     NA
20      20   NA     NA     NA     NA


> dput(sample)
list(c("", "2"), c("", "1918"), "", "", c("", "1912", "1913"), 
    c("", "1893", "1898", "1925", "1993"), c("", "1820", "1830", 
    "1899", "1900"), "", c("", "1808", "1810", "1854", "1905", 
    "1907"), "", "", c("", "1885"), c("", "1900"), c("", "1926", 
    "1933"), "", "", c("", "1870"), c("", "1", "1923"), "", "")

【问题讨论】:

  • 元素 9 包含 5 个四位数字,但生成的数据帧只有其中三个。 year 列是怎么回事?应该一直是NA吗?
  • 举个例子会很有帮助:stackoverflow.com/questions/5963269/…。同时:l = sample(800:1200, 10); l[grep("\\d{4}", l)]

标签: r list extract


【解决方案1】:

我们可以使用plyr包中的rbind.fill绑定列表,然后grepl处理你的情况,

df <- rbind.fill(lapply(lst1,function(i)as.data.frame(t(i))))
df[!apply(df, 1:2, function(i) grepl('[0-9]{4}', i))] <- NA
head(df)
#    V1   V2   V3   V4   V5   V6
#1 <NA> <NA> <NA> <NA> <NA> <NA>
#2 <NA> 1918 <NA> <NA> <NA> <NA>
#3 <NA> <NA> <NA> <NA> <NA> <NA>
#4 <NA> <NA> <NA> <NA> <NA> <NA>
#5 <NA> 1912 1913 <NA> <NA> <NA>
#6 <NA> 1893 1898 1925 1993 <NA>

【讨论】:

    【解决方案2】:

    我认为sapply是您正在寻找的。对于您的名为 sample 的列表:

    sapply(sample, function(i) sum(i != ""))
    

    然后您可以提取列表中符合您的标准的元素,如下所示:

    myNewSample <- sample[which(sapply(sample, function(i) sum(i != ""))) == 4]
    

    顺便说一句,不建议使用“sample”作为列表对象的名称,因为它在 R 中是一个相当重要的函数。请参阅?sample

    【讨论】:

      猜你喜欢
      • 2018-10-24
      • 2021-07-27
      • 1970-01-01
      • 2020-10-11
      • 2018-02-06
      • 1970-01-01
      • 2020-02-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多