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())

但是,如果我们将fillnames(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:填写多列的主要内容,如果未能解决你的问题,请参考以下文章

r 在R中将一列分成多列

安卓gridview 网格,多行多列实现

R语言tidyr包separate()函数实战详解:一列裂变为多列

r 将函数行方式应用于多列

r 用多列dplyr传播

R语言dplyr包arrage函数排序dataframe实战:单列排序多列排序自定义排序