即使data.frame为空,如何安全地替换data.frame中的值?

时间:2015-08-18 09:51:48

标签: r dataframe

我在编写安全代码以操纵R中的数据帧时遇到问题。我遇到的问题是df[...] <- (...)容易受到没有行的data.frame(除其他外! )。

示例1:

df <- data.frame(a = 1:2, b = c(NA, 5))
df[is.na(df$b), 'b'] <- 0

我想要的是 - 用0替换NA。

示例2:

df.empty <- data.frame(a = character(), b = character())
df.empty[is.na(df.empty$b), 'b'] <- 0
df.empty[is.na(df.empty$b), 'b', drop = F] <- 0

两次尝试改变示例2中的数据帧都会导致错误(替换有1行,数据有0;或者&#39;未使用的参数(drop = F))。

我发现这非常烦人。

如何普遍根据data.frame中的任意(矢量)条件变异列,而不必手动检查所有可能的条件,如NA,NULL,无行,强制向量因为没有行等?

4 个答案:

答案 0 :(得分:1)

我在第二个例子中看到了矢量标准的逻辑问题。在以下代码中:

df.empty <- data.frame(a = character(), b = character())
df.empty[is.na(df.empty$b), 'b'] <- 0

您使用标准is.na来选择行范围,但没有行,因此返回factor(0),这不是有效范围。考虑这个例子:

df.empty <- data.frame(a = numeric(), b = numeric())
df.empty[1:2, 'b'] <- 0

> df.empty
   a b
1 NA 0
2 NA 0

当您使用有效范围作为标准时,进行分配没有问题。为简单起见,我选择使用numeric列。

答案 1 :(得分:1)

也许使用<PropertyGroup> <TypeScriptToolsVersion Condition="'$(TypeScriptToolsVersion)'==''">1.4</TypeScriptToolsVersion> <TscToolPath Condition="'$(TscToolPath)' == ''">$(MSBuildProgramFiles32)\Microsoft SDKs\TypeScript</TscToolPath> <TscToolPath Condition="'$(TypeScriptToolsVersion)' != ''">$(TscToolPath)\$(TypeScriptToolsVersion)</TscToolPath> <TscToolExe Condition="'$(TscToolExe)' == ''">tsc.exe</TscToolExe> <TscYieldDuringToolExecution Condition="'$(TscYieldDuringToolExecution)' == ''">true</TscYieldDuringToolExecution> </PropertyGroup>

这个结合dplyrmutate()的例子似乎达到了你想要的效果。

ifelse()

答案 2 :(得分:0)

如果空集的每个元素都映射到0,我们仍然有空集。 因此,在示例2中,数据帧不应受赋值的影响。 我不知道为什么,但要摆脱错误信息,它有助于制作数据表:

df.empty <- data.frame(a = character(), b = character())
setDT(df.empty)
df.empty[is.na(df.empty$b), 'b'] <- 0
df.empty

没有错误消息:

> source('~/.active-rstudio-document', echo=TRUE)

> df.empty <- data.frame(a = character(), b = character())

> setDT(df.empty)

> df.empty[is.na(df.empty$b), 'b'] <- 0

> df.empty
Empty data.table (0 rows) of 2 cols: a,b
> 

答案 3 :(得分:0)

经常使用rep()

我这样做:

df.empty[is.na(df.empty$b), 'b'] <- rep(0, sum(is.na(df.empty$b)))

通过这种方式,您可以生成0到0的n长度向量,其中n是要替换的行数,也可能是0.

在这种情况下,它有点kludgy,但我经常将其用作df[,"col"] <- rep(x, nrow(df))