R 从列表中提取一定长度的数字

R 从列表中提取一定长度的数字,r,list,extract,R,List,Extract,我有一个包含数千个元素的列表,有些元素包含年份,这些元素是由4个数字组成的字符串,有些元素包含我需要去掉的随机数 我只需要从列表中提取长度为4的数字,然后删除所有其他数字。最后,我需要一个由20行和20列组成的数据框架,其中包含嵌套在列表中的年份。例如,在下面的示例中,我需要一个如下所示的表 > sample_years element year year.1 year.2 year.3 1 1 NA NA NA NA 2 2

我有一个包含数千个元素的列表,有些元素包含年份,这些元素是由4个数字组成的字符串,有些元素包含我需要去掉的随机数

我只需要从列表中提取长度为4的数字,然后删除所有其他数字。最后,我需要一个由20行和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"), "", "")

我们可以使用
rbind.fill
from
plyr
包绑定列表,然后
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>

df我们可以使用
rbind.fill
from
plyr
包绑定列表,然后
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>

df我想
sapply
就是你要找的。对于您的命名样本列表:

sapply(sample, function(i) sum(i != ""))
然后,您可以提取符合条件的列表元素,如下所示:

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

myNewSample我认为
sapply
正是您所寻找的。对于您的命名样本列表:

sapply(sample, function(i) sum(i != ""))
然后,您可以提取符合条件的列表元素,如下所示:

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

myNewSample元素9包含5个四位数字,但生成的数据帧只有其中三个。那么
列是什么?如果总是
NA
?请给出一个示例:。平均时间:l=样品(800:1200,10);l[grep(“\\d{4}”,l)]元素9包含5个四位数字,但生成的数据帧只有其中三个。那么
列是什么?如果总是
NA
?请给出一个示例:。平均时间:l=样品(800:1200,10);l[grep(“\\d{4}”,l)]