我在编写安全代码以操纵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,无行,强制向量因为没有行等?
答案 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>
?
这个结合dplyr
和mutate()
的例子似乎达到了你想要的效果。
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))
。