R 为逻辑文件应用前置空间

R 为逻辑文件应用前置空间,r,space,chr,R,Space,Chr,apply和R3.0.1在这里有一个奇怪的问题 我有一个包含文本、数字和逻辑值的巨大数据框。 当我使用apply时,逻辑值被转换为chr,但是因为 R允许像TRUE==“TRUE”这样的东西,这不是问题 但对于某些逻辑值,apply似乎在空格前加上前缀,TRUE==“TRUE”返回NA。当然可以 sapply(cuelist[,4],FUN=function(logicalvalue) as.logical(sub("^ +", "", logicalvalue))) 但这并不好,我仍然不知道

apply和R3.0.1在这里有一个奇怪的问题

我有一个包含文本、数字和逻辑值的巨大数据框。 当我使用apply时,逻辑值被转换为chr,但是因为 R允许像TRUE==“TRUE”这样的东西,这不是问题

但对于某些逻辑值,apply似乎在空格前加上前缀,TRUE==“TRUE”返回NA。当然可以

sapply(cuelist[,4],FUN=function(logicalvalue) as.logical(sub("^ +", "", logicalvalue)))
但这并不好,我仍然不知道为什么R会这样做

df <- data.frame(test=c("a","b","<",">"),logi=c(TRUE,FALSE,FALSE,TRUE))
apply(df, MARGIN=1, function(listelement) print(listelement) )
df
测试逻辑
一个假的
2 b错误
3<正确
4>正确
>str(df)
“data.frame”:4个obs。共有2个变量:
$test:系数w/4级“,”a“,”b“:3 4 1 2
$logi:logi FALSE FALSE TRUE

将数据帧转换为矩阵的肯定是应用,因此所有元素都具有相同的类型,这里是字符,逻辑被转换为它。 TRUE转换为“TRUE”以匹配“FALSE”的字符数:

要使人信服:

as.matrix(df)
相反,您可以使用plyr包中的a*层,例如

a_ply(df, 1, print)

这肯定是由于apply将数据帧转换为矩阵,所以所有元素都具有相同的类型,这里是字符,并且逻辑被转换为它。 TRUE转换为“TRUE”以匹配“FALSE”的字符数:

要使人信服:

as.matrix(df)
相反,您可以使用plyr包中的a*层,例如

a_ply(df, 1, print)

在某种程度上,问题在于
apply
,但更恰当地说,问题在于
as.matrix
,以及它如何处理
逻辑值

这里有几个例子来帮助详细说明我对Karl的疑问

首先,让我们创建四个
data.frame
s来进行一些测试

  • 您的原始
    data.frame
    演示行为:
  • 一个
    data.frame
    ,在“test”列中有不同数量的字符,用于查看Karl对发生的事情的解释
  • 一个带有一些数字的
    data.frame
    ,帮助我们开始了解实际发生的事情
  • 一个
    data.frame
    ,其中“logi”列被显式创建为
    as.character
  • 这在
    TRUE
    之前有一个空格,但“test”列不受影响。嗯

    as.matrix(df2)
    #      test logi   
    # [1,] "aa" " TRUE"
    # [2,] "b"  "FALSE"
    # [3,] "<"  "FALSE"
    # [4,] ">>" " TRUE"
    
    如果您告诉R
    logi
    列是一个字符列,这里的情况似乎很好

    as.matrix(df4)
    #      test logi   
    # [1,] "aa" "TRUE" 
    # [2,] "b"  "FALSE"
    # [3,] "<"  "FALSE"
    # [4,] ">>" "TRUE" 
    

    更新 在R公共聊天室,Joshua Ulrich指出
    format
    是罪魁祸首
    as.matrix
    使用
    as.vector
    作为因子,将其转换为字符(尝试
    str(as.vector(df1$test))
    来了解我的意思;对于其他所有内容,它都使用
    格式
    ,但不幸的是,它没有包含
    格式
    中任何参数的选项,其中一个是
    trim
    (默认设置为
    FALSE

    比较以下各项:

    A <- c(TRUE, FALSE)
    
    format(A)
    # [1] " TRUE" "FALSE"
    format(A, trim = TRUE)
    # [1] "TRUE"  "FALSE"
    format(as.character(A))
    # [1] "TRUE " "FALSE"
    format(as.factor(A))
    # [1] "TRUE " "FALSE"
    

    A在某种程度上,问题在于
    apply
    ,但更恰当地说,问题在于
    as.matrix
    ,以及它如何处理
    逻辑值

    这里有几个例子来帮助详细说明我对Karl的疑问

    首先,让我们创建四个
    data.frame
    s来进行一些测试

  • 您的原始
    data.frame
    演示行为:
  • 一个
    data.frame
    ,在“test”列中有不同数量的字符,用于查看Karl对发生的事情的解释
  • 一个带有一些数字的
    data.frame
    ,帮助我们开始了解实际发生的事情
  • 一个
    data.frame
    ,其中“logi”列被显式创建为
    as.character
  • 这在
    TRUE
    之前有一个空格,但是“test”列不受影响

    as.matrix(df2)
    #      test logi   
    # [1,] "aa" " TRUE"
    # [2,] "b"  "FALSE"
    # [3,] "<"  "FALSE"
    # [4,] ">>" " TRUE"
    
    如果您告诉R
    logi
    列是一个字符列,这里的情况似乎很好

    as.matrix(df4)
    #      test logi   
    # [1,] "aa" "TRUE" 
    # [2,] "b"  "FALSE"
    # [3,] "<"  "FALSE"
    # [4,] ">>" "TRUE" 
    

    更新 在R公共聊天室,Joshua Ulrich指出
    格式
    是罪魁祸首。
    as.matrix
    使用
    as.vector
    作为因子,将因子转换为字符(try
    str(as.vector(df1$test))
    了解我的意思;对于其他所有内容,它都使用
    格式
    ,但不幸的是,它没有包含
    格式
    中任何参数的选项,其中一个参数是
    修剪
    (默认设置为

    比较以下各项:

    A <- c(TRUE, FALSE)
    
    format(A)
    # [1] " TRUE" "FALSE"
    format(A, trim = TRUE)
    # [1] "TRUE"  "FALSE"
    format(as.character(A))
    # [1] "TRUE " "FALSE"
    format(as.factor(A))
    # [1] "TRUE " "FALSE"
    


    A评论不允许使用代码。请稍等。@anandamah想看我编辑的帖子。谢谢你的回复!你能发布
    print(df,quote=TRUE)
    的输出吗?评论不允许使用代码。请稍等。@anandamah想看我编辑的帖子。谢谢你的回复!你能发布
    print(df,quote=TRUE)的输出吗
    ?啊,我现在明白了。@AnandaMahto是对的,print(df,quote=TRUE)也确实添加了空格,但我仍然能够执行df[1,1]==是的。除了plyr还有其他方法吗?我需要并行包的paraply,它具有相同的行为。您是否确实使用其他示例对此进行了测试?我认为这个答案不太正确。请尝试您对
    df1的解释是的,没错,但您仍然能够执行类似df1[3,2]的操作==TRUE,虽然这在apply函数中不起作用。plyr还提供了与.parallel选项的并行化。我现在明白了。@AnandaMahto是对的,print(df,quote=TRUE)确实也添加了空格,但我仍然能够执行df[1,1]==是的。除了plyr还有其他方法吗?我需要并行包的paraply,它具有相同的行为。您是否确实使用其他示例对此进行了测试?我认为这个答案不太正确。请尝试您对
    df1的解释是的,没错,但您仍然能够执行类似df1[3,2]的操作==TRUE,虽然这在apply函数中不起作用。plyr还提供了与.parallel选项的并行化。这非常好!这样我就可以在数据帧被apply/paraply处理之前对其进行预编辑。不过,我认为这并不合适
    
    A <- c(TRUE, FALSE)
    
    format(A)
    # [1] " TRUE" "FALSE"
    format(A, trim = TRUE)
    # [1] "TRUE"  "FALSE"
    format(as.character(A))
    # [1] "TRUE " "FALSE"
    format(as.factor(A))
    # [1] "TRUE " "FALSE"
    
    df1[sapply(df1, is.logical)] <- lapply(df1[sapply(df1, is.logical)], as.character)
    df1
    #   test  logi
    # 1    a  TRUE
    # 2    b FALSE
    # 3    < FALSE
    # 4    >  TRUE
    as.matrix(df1)
    #      test logi   
    # [1,] "a"  "TRUE" 
    # [2,] "b"  "FALSE"
    # [3,] "<"  "FALSE"
    # [4,] ">"  "TRUE"