R如何在data.frame中循环所有字符变量并更改特定值
我试图循环一个data.table中的所有变量,并修改所有字符变量;这些字符变量的某些值为“NULL”,我想将它们更改为“” 例如:我想改变R如何在data.frame中循环所有字符变量并更改特定值,r,loops,dataframe,dplyr,lapply,R,Loops,Dataframe,Dplyr,Lapply,我试图循环一个data.table中的所有变量,并修改所有字符变量;这些字符变量的某些值为“NULL”,我想将它们更改为“” 例如:我想改变 library(data.table) df <- data.table('id' = seq(1:10), 'datadate' = seq(as.Date('2015-01-01'), as.Date('2015-01-10'), by="days"), 'charvar' =
library(data.table)
df <- data.table('id' = seq(1:10),
'datadate' = seq(as.Date('2015-01-01'), as.Date('2015-01-10'), by="days"),
'charvar' = c('a', 'b', 'c', rep('NULL', 7)),
'charvar1' = c('a', 'b', 'c', 'd', rep('NULL', 6)))
id datadate charvar charvar1
1: 1 2015-01-01 a a
2: 2 2015-01-02 b b
3: 3 2015-01-03 c c
4: 4 2015-01-04 NULL d
5: 5 2015-01-05 NULL NULL
6: 6 2015-01-06 NULL NULL
7: 7 2015-01-07 NULL NULL
8: 8 2015-01-08 NULL NULL
9: 9 2015-01-09 NULL NULL
10: 10 2015-01-10 NULL NULL
我尝试了两种方法:
第一种方法:
df %>%
mutate_if(is.character(.)==TRUE,
funs(function(col){col = if_else(col=='NULL', '', col)}))
从中我得到了错误:
Error: length(.p) == length(vars) is not TRUE
第二种方法:
data.frame(
lapply(df, function(col)
{if(is.character(col)==TRUE) col = ifelse(col=='NULL', '', col)})
)
这是我的错误
Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, :
arguments imply differing number of rows: 0, 10
我做错了什么?如果您能深入了解如何纠正这两种方法以及上述代码错误的原因,我们将不胜感激。由于
df
是一个数据。table
,您可以通过在i
中提供[.data.table
逻辑向量并在j
中分配新值来修改特定行,例如df[charvar='NULL',charvar:=''']
。因此,您可以对所有字符列执行lappy
,以对每个字符列执行此操作。这避免了使用ifelse
,从而避免了每次重新指定整个列
library(data.table)
lapply(names(df)[sapply(df, is.character)], #lapply over all character column names
function(x) df[df[[x]] == 'NULL', (x) := '']) #set column equal to '' for rows where it equals 'NULL'
如果要使用dplyr,可以执行以下操作
library(dplyr)
df %>%
mutate_if(is.character,
function(col) if_else(col == 'NULL', '', col))
在tidyverse
中(在一定程度上是一致的),
表示管道的左侧%%>%
。因此,如果使用is.character(.)
作为第一个参数,dplyr
将计算is.character(df)
,即FALSE
,长度为1
的逻辑向量。但如果期望长度为ncol(df)
的逻辑向量或函数,则会发生变化
列大于1个字符的示例数据
df <- data.table('id' = seq(1:10),
'datadate' = seq(as.Date('2015-01-01'), as.Date('2015-01-10'), by="days"),
'charvar' = c('a', 'b', 'c', rep('NULL', 7)),
'charvar2' = sample(c('a', 'b', 'c', rep('NULL', 7))) )
df第一个方法给出了一个奇怪的结果,如果我有多个字符变量,它会复制df。例如,如果我将其应用于一个包含两个字符变量的data.table(请参阅我原始问题中的修订df)。你能解释一下为什么会发生这种情况吗?我不确定。我刚刚添加到答案中的示例df
对我有效,它有两个字符列。我试图返回data.frame或data.table,所以我包装了data.frame()这就是为什么我得到了我得到的结果。你的代码返回两个元素的列表。我应该如何修改它以获得data.frame或data.table?忽略它返回的任何内容,因为它返回的内容并不重要。你不需要使用OK I see,那么我如何让它不打印结果,因为我的数据集是安静的大的
df <- data.table('id' = seq(1:10),
'datadate' = seq(as.Date('2015-01-01'), as.Date('2015-01-10'), by="days"),
'charvar' = c('a', 'b', 'c', rep('NULL', 7)),
'charvar2' = sample(c('a', 'b', 'c', rep('NULL', 7))) )