我有以下数据框:
freq.a freq.b
1 NULL 0.055
2 0.030 0.055
3 0.060 0.161
4 0.303 0.111
5 0.393 0.111
6 0.121 0.388
7 0.090 0.111
我想将NULL
替换为实际的0.但是执行df.m[is.null(df.m)] <- 0
并不会更改数据框中的任何内容。
MWE如下(对不起长度):
library(plyr)
df.a <- c(5, 4, 5, 7, 3, 5, 6, 5, 5, 4, 5, 5, 4, 5, 4, 7, 2, 4, 4, 5, 3, 6, 5, 6, 4, 4, 5, 4, 5, 5, 6, 7, 4)
df.b <- c(1, 3, 4, 6, 2, 7, 7, 4, 3, 6, 6, 3, 6, 6, 5, 6, 6, 5)
df.a.count <- count(df.a)
df.b.count <- count(df.b)
#normalize the data
df.a.count$freq <- lapply(df.a.count$freq, function(X) X/length(df.a))
df.b.count$freq <- lapply(df.b.count$freq, function(X) X/length(df.b))
df.m <- merge(df.a.count, df.b.count, by ='x', all=TRUE)[2:3]
names(df.m) <- c('freq.a', 'freq.b')
#replace the NULL's with 0
df.m[is.null(df.m)] <- 0
答案 0 :(得分:10)
您不应该使用sapply
。请改用NA
。这将产生NULL
而不是df.m[is.na(df.m)] <- 0
。然后你可以这样做:
lapply
<强>解释强>
sapply
返回列表而不是向量。在列表中,您可以具有NULL值。 NA
以向量的形式返回相同的值,但使用NULL
而不是<?php $value = round(100 * ($data[$tabele[$i]][$keys[$tabele[$i]][0]] + $data[$tabele[$i]]["RESERVED"] + $data[$tabele[$i]]["BIZ_AVAILABLE"]) / ArraySum($data[$tabele[$i]]) ,2));
if($value<10)
echo '<td style="font-weight: bold; color: red;">'.$value.'%</td>';
else
echo '<td style="font-weight: bold; color: black;">'.$value.'%</td>';
?>
s。
答案 1 :(得分:1)
原因是使用lapply
返回list
,可以很容易地看到数据集的结构,即str(df.m)
。
我们也可以单独使用base R
执行此操作。获取unique
s('lvls')中的所有vector
元素,通过将factor
指定为'lvls'将数据集转换为levels
,获取频率如果需要,计算(table
)和比例(prop.table
),cbind
输出和round
。
lvls <- sort(union(unique(df.a), unique(df.b)))
round(cbind(prop.table(table(factor(df.a, levels = lvls))),
prop.table(table(factor(df.b, levels = lvls)))), 3)
# [,1] [,2]
#1 0.000 0.056
#2 0.030 0.056
#3 0.061 0.167
#4 0.303 0.111
#5 0.394 0.111
#6 0.121 0.389
#7 0.091 0.111