将prepends空间应用于逻辑

时间:2013-09-04 12:46:59

标签: r space chr

这里有一个奇怪的问题,申请和R 3.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) )

有趣的是,这些空格仅出现在[2,1]和[2,4]

上的这个例子中
  

版本                  _
  平台x86_64-w64-mingw32
  拱x86_64
  os mingw32
  system x86_64,mingw32
  状态
  专业3   小0.1   2013年   月05日   第16天   svn rev 62743
  语言R
  version.string R版本3.0.1(2013-05-16)   昵称Good Sport

编辑:R版本2.15.0(2012-03-30)上的相同行为

Edit2:我的数据框像这样展开

> df
  test  logi
1    a FALSE
2    b FALSE
3    <  TRUE
4    >  TRUE

> str(df)
'data.frame':   4 obs. of  2 variables:
 $ test: Factor w/ 4 levels "<",">","a","b": 3 4 1 2
 $ logi: logi  FALSE FALSE TRUE TRUE

2 个答案:

答案 0 :(得分:3)

在某种程度上,问题出在apply,但更合适的是问题在于as.matrix,以及它如何处理logical值。

以下是一些示例,以帮助详细说明我对Karl的查询。

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

  1. 您的原始data.frame以演示行为:
  2. “{1}}在”测试“列中包含不同数量的字符,以查看Karl对正在发生的事情的解释。
  3. data.frame有一些数字可以帮助我们开始了解实际情况。
  4. data.frame,其中“logi”列已明确创建data.frame
  5. as.character

    现在,让我们对每个人使用df1 <- data.frame(test = c("a","b","<",">"), logi = c(TRUE,FALSE,FALSE,TRUE)) df2 <- data.frame(test = c("aa","b","<",">>"), logi = c(TRUE,FALSE,FALSE,TRUE)) df3 <- data.frame(test = c("aa","b","<",">>"), logi = c(TRUE,FALSE,FALSE,TRUE), num = c(1, 12, 123, 2)) df4 <- data.frame(test = c("aa","b","<",">>"), logi = as.character(c(TRUE,FALSE,FALSE,TRUE)))

    as.matrix之前有一个空格。

    TRUE

    as.matrix(df1) # test logi # [1,] "a" " TRUE" # [2,] "b" "FALSE" # [3,] "<" "FALSE" # [4,] ">" " TRUE" 之前有一个空格,但“测试”列不受影响。 HMM。

    TRUE

    啊......在as.matrix(df2) # test logi # [1,] "aa" " TRUE" # [2,] "b" "FALSE" # [3,] "<" "FALSE" # [4,] ">>" " TRUE" 之前有一个空格,空格在较短的数字之前。因此,似乎R正在考虑TRUETRUE的数字基础值,但计算FALSETRUE中字符数的宽度。同样,第一个“测试”列仍然不受影响。

    FALSE

    如果你告诉R as.matrix(df3) # test logi num # [1,] "aa" " TRUE" " 1" # [2,] "b" "FALSE" " 12" # [3,] "<" "FALSE" "123" # [4,] ">>" " TRUE" " 2" 列是一个字符列。

    ,这里的情况似乎很好
    logi

    对于它的价值,as.matrix(df4) # test logi # [1,] "aa" "TRUE" # [2,] "b" "FALSE" # [3,] "<" "FALSE" # [4,] ">>" "TRUE" 似乎没有那个问题。

    sapply

    更新

    在R公共聊天室,Joshua Ulrich指出sapply(df1, as.matrix) # test logi # [1,] "a" "TRUE" # [2,] "b" "FALSE" # [3,] "<" "FALSE" # [4,] ">" "TRUE" 是罪魁祸首。 format使用as.matrix因素将其转换为字符(尝试as.vector以查看我的意思;对于其他所有内容,它使用str(as.vector(df1$test))但不幸的是,它不会可以选择包含format中的任何参数,其中一个参数为format(默认设置为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"
    

答案 1 :(得分:1)

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

"FALSE"
" TRUE"

得到说服:

as.matrix(df)

相反,您可以使用plyr包中的a * ply,例如

a_ply(df, 1, print)