替换数据帧中的NULL

时间:2016-11-25 11:30:52

标签: r

我有以下数据框:

  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

2 个答案:

答案 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