R 在列中填充缺少的值,然后进行筛选

R 在列中填充缺少的值,然后进行筛选,r,na,missing-data,R,Na,Missing Data,我正在抓取一些PDF数据,在我准备进入下一步之前需要注意它。列x1是唯一ID,然后x2是采集类型。我需要跨这些类型复制UID,以便根据类型进行筛选。下面是一些示例数据以及我想要了解的内容。我现在对type4特别感兴趣,但以后可能需要其他类型 我没有尝试过的代码,因为我不确定如何解决这个问题。采集类型是一致的-在示例数据中,始终有4种类型,UID确实出现在x1和x2列中 数据如何读入R: df <- data.frame(x1 = c(100, "", "&qu

我正在抓取一些PDF数据,在我准备进入下一步之前需要注意它。列x1是唯一ID,然后x2是采集类型。我需要跨这些类型复制UID,以便根据类型进行筛选。下面是一些示例数据以及我想要了解的内容。我现在对type4特别感兴趣,但以后可能需要其他类型

我没有尝试过的代码,因为我不确定如何解决这个问题。采集类型是一致的-在示例数据中,始终有4种类型,UID确实出现在x1和x2列中

数据如何读入R:

df <- data.frame(x1 = c(100, "", "", "", "", 101, "", "", "", "", 102, "", "", "", ""),
                 x2 = c(100, "type1", "type2", "type3", "type4", 101, "type1", "type2", "type3", "type4", 102, "type1", "type2", "type3", "type4"),
                 x3 = c(1:15),
                 x4 = c(31:45),
                 x5 = c(100:114))

    x1    x2 x3 x4  x5
1  100   100  1 31 100
2      type1  2 32 101
3      type2  3 33 102
4      type3  4 34 103
5      type4  5 35 104
6  101   101  6 36 105
7      type1  7 37 106
8      type2  8 38 107
9      type3  9 39 108
10     type4 10 40 109
11 102   102 11 41 110
12     type1 12 42 111
13     type2 13 43 112
14     type3 14 44 113
15     type4 15 45 114


df按要求-首先填充,然后过滤。。。
这只使用了
tidyverse
。我已先将空字符串“”替换为NA

库(tidyverse)
df%
变异(x1=as.integer(x1))%>%
填充(x1)%>%
过滤器(x2==“类型4”)
#>x1x2x3x4x5
#>1100类型4 5 35 104
#>2 101类型4 10 40 109
#>3 102类型4 15 45 114
另一种方法是利用数据的明显有序和规则结构:(仅在本例中使用base R)

x1 10 101类型4 10 40 109
#>15 102类型4 15 45 114

使用
拆分联合收割机。使用
变换
回收x1的第一个元素

res <- `rownames<-`(do.call(rbind, by(df, rep(1:(nrow(df)/5), each=5), function(x) {
  transform(x, x1=x1[1])
})), NULL)
res
#     x1    x2 x3 x4  x5
# 1  100   100  1 31 100
# 2  100 type1  2 32 101
# 3  100 type2  3 33 102
# 4  100 type3  4 34 103
# 5  100 type4  5 35 104
# 6  101   101  6 36 105
# 7  101 type1  7 37 106
# 8  101 type2  8 38 107
# 9  101 type3  9 39 108
# 10 101 type4 10 40 109
# 11 102   102 11 41 110
# 12 102 type1 12 42 111
# 13 102 type2 13 43 112
# 14 102 type3 14 44 113
# 15 102 type4 15 45 114

注意:
`rownamesHello,我遇到了一个小问题,我无法解决。每隔一段时间,我就会得到x1中的一些东西,比如100B。我尝试过更改您的变异行,删除它,甚至将其更改为
fill(X1,.direction=“down”)
,但我没有任何运气。@pkpto39是在删除pdf后导入的数据中的吗?下一个问题——它总是“B”还是那些独特的字母?在这种情况下,我的as.integer(x1)技巧当然会失败。可能尝试
mutate(x1=ifelse(x1==“”,NA,x1))
etc-这样就可以直接用NA替换空值。实际上,我的数据上有MB,它们随机出现。不过,我确实需要保持这种性格。例如,100MB和100都可以表示。@pkpto39您是否尝试过使用
ifelse
res <- `rownames<-`(do.call(rbind, by(df, rep(1:(nrow(df)/5), each=5), function(x) {
  transform(x, x1=x1[1])
})), NULL)
res
#     x1    x2 x3 x4  x5
# 1  100   100  1 31 100
# 2  100 type1  2 32 101
# 3  100 type2  3 33 102
# 4  100 type3  4 34 103
# 5  100 type4  5 35 104
# 6  101   101  6 36 105
# 7  101 type1  7 37 106
# 8  101 type2  8 38 107
# 9  101 type3  9 39 108
# 10 101 type4 10 40 109
# 11 102   102 11 41 110
# 12 102 type1 12 42 111
# 13 102 type2 13 43 112
# 14 102 type3 14 44 113
# 15 102 type4 15 45 114
res[res$x2 %in% "type4", ]
#     x1    x2 x3 x4  x5
# 5  100 type4  5 35 104
# 10 101 type4 10 40 109
# 15 102 type4 15 45 114