Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R如何在data.frame中循环所有字符变量并更改特定值_R_Loops_Dataframe_Dplyr_Lapply - Fatal编程技术网

R如何在data.frame中循环所有字符变量并更改特定值

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' =

我试图循环一个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' = 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))) )