R:填写多列
Posted
技术标签:
【中文标题】R:填写多列【英文标题】:R: fill down multiple columns 【发布时间】:2016-10-05 13:30:06 【问题描述】:我正在使用 tidyr 包中的 fill()。 fill(df, colname1, colname2, colname3) 工作正常,直到我找到一个包含 32 个变量的数据集。我应该如何填写所有列而不输入每个名称?
我试过了:
fill(df,colnames(df)),
fill(df,1:32),
fill(df,colname1:colname32).
并产生以下错误:
Error: All select() inputs must resolve to integer column positions.
The following do not:
* colnames(df1)
Error: tinyformat: Not enough conversion specifiers in format string
Error: tinyformat: Not enough conversion specifiers in format string
【问题讨论】:
鉴于您说 fill(df, 1:32) 不起作用,并且下面提供的常规评估选项也不起作用,您的数据框(该对象的类)可能存在问题?你能提供class(df)
和str(df)
的输出吗
【参考方案1】:
基于@akrun 的评论和数据,这里有另外两种使用 tidyr 的方法:
数据
set.seed(24)
df <- data.frame(col1= sample(c(NA, 1:3), 20, replace=TRUE),
col2 = sample(c(NA, 1:5), 20, replace=TRUE),
col3 = sample(c(NA, letters[1:5]), 20, replace=TRUE),
stringsAsFactors=FALSE)
两个选项
#Specify column names
fill(df, c("col1", "col2"), .direction = "down")
#Specify range of columns
fill(df, c(col1:col3), .direction = "down")
【讨论】:
【参考方案2】:包zoo
的另一种选择,如果需要也可以向后填充。
在上面创建的示例中-
zoo::na.locf(df)
col1 col2 col3
1 2 4 e
2 2 4 e
3 3 4 a
4 2 4 b
5 1 3 d
6 2 4 d
7 2 1 b
8 1 1 e
9 3 3 e
10 1 2 e
11 1 4 e
12 1 1 e
13 3 1 a
14 3 4 c
15 3 3 b
16 2 3 e
17 3 1 e
18 3 2 b
19 3 5 c
20 3 5 e
df
在哪里
col1 col2 col3
1 2 4 e
2 2 NA e
3 3 4 a
4 2 4 b
5 1 3 d
6 2 4 <NA>
7 NA 1 b
8 1 NA e
9 3 3 <NA>
10 1 2 e
11 1 4 e
12 NA 1 <NA>
13 3 NA a
14 NA 4 c
15 3 3 b
16 2 3 e
17 3 1 e
18 NA 2 b
19 NA 5 c
20 3 5 e
【讨论】:
【参考方案3】:当我们使用names
选择变量时,我们可以使用fill_
。
library(tidyr)# using tidyr_0.4.1.9000
res <- fill_(df, names(df))
head(res)
# col1 col2 col3
#1 1 NA b
#2 1 3 b
#3 2 4 a
#4 2 4 a
#5 2 1 a
#6 3 4 a
其他选项是
fill(df, everything())
但是,如果我们将fill
与names(df))
一起使用,则会给出与OP 显示的相同的错误
fill(df, names(df)[1])
#Error: All select() inputs must resolve to integer column positions.
#The following do not:
#* names(df)[1]
数据
set.seed(24)
df <- data.frame(col1= sample(c(NA, 1:3), 20, replace=TRUE),
col2 = sample(c(NA, 1:5), 20, replace=TRUE),
col3 = sample(c(NA, letters[1:5]), 20, replace=TRUE),
stringsAsFactors=FALSE)
【讨论】:
它给出以下错误:错误:tinyformat:格式字符串中没有足够的转换说明符 @woshishui 它适用于我展示的示例。由于您没有展示可重现的示例,因此很难评论 @woshishui 我也尝试使用混合类数据集。它对我有用。 可能是版本问题?packageVersion('tidyr')
的输出可能很有用。奇怪fill(df, 1:32)
不起作用。
akrun 和 Gopala,在尝试重现数据时,我在列名中发现了 NA。在 read.xlsx 导入数据时,带有 ' 的列名作为 NA 在数据框中传递。这导致了 fill() 的问题。解决问题后,所有三种方法 fill_(df, names(df))、fill(df,1:32) 和 fill(df, colname1:colname32) 都有效。我应该删除这个问题吗?会不会误导?感谢您的帮助,因为如果您不指出我做对的地方,我将不知道哪里出了问题。以上是关于R:填写多列的主要内容,如果未能解决你的问题,请参考以下文章