R 为逻辑文件应用前置空间
apply和R3.0.1在这里有一个奇怪的问题 我有一个包含文本、数字和逻辑值的巨大数据框。 当我使用apply时,逻辑值被转换为chr,但是因为 R允许像TRUE==“TRUE”这样的东西,这不是问题 但对于某些逻辑值,apply似乎在空格前加上前缀,TRUE==“TRUE”返回NA。当然可以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))) 但这并不好,我仍然不知道
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"
如果您告诉Rlogi
列是一个字符列,这里的情况似乎很好
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"
如果您告诉Rlogi
列是一个字符列,这里的情况似乎很好
as.matrix(df4)
# test logi
# [1,] "aa" "TRUE"
# [2,] "b" "FALSE"
# [3,] "<" "FALSE"
# [4,] ">>" "TRUE"
更新
在R公共聊天室,Joshua Ulrich指出格式
是罪魁祸首。as.matrix
使用as.vector
作为因子,将因子转换为字符(trystr(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"