这里有一个奇怪的问题,申请和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
答案 0 :(得分:3)
在某种程度上,问题出在apply
,但更合适的是问题在于as.matrix
,以及它如何处理logical
值。
以下是一些示例,以帮助详细说明我对Karl的查询。
首先,让我们创建四个data.frame
来进行一些测试。
data.frame
以演示行为:data.frame
有一些数字可以帮助我们开始了解实际情况。data.frame
,其中“logi”列已明确创建data.frame
。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正在考虑TRUE
和TRUE
的数字基础值,但计算FALSE
和TRUE
中字符数的宽度。同样,第一个“测试”列仍然不受影响。
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)