我有一个看起来像这样的数据框,但整年都是
date v1 v2 v3 v4 v5 v6 v7 v8 Fraction Percent
01-02-2013 0 0 1 1 1 1 1 0 0.625
01-03-2013 0 0 1 1 0 0 0 0 0.25
01-04-2013 0 0 0 0 0 1 0 0 0.125
01-05-2013 0 0 0 0 0 0 1 0 0.125
01-06-2013 0 0 0 0 0 0 0 0 0
....................................................
....................................................
我的兴趣是计算分数列的百分比。我尝试使用prop.table
但它没有用。
我也试过
df$Percent <- df$Fraction * 100
它给了我以下错误
Error in df$Fraction[i] * 100 : non-numeric argument to binary operator
我已尝试在循环中执行此操作,这是我使用过的代码
df$Fraction <- 'NA'
df$Percent <- 'NA'
for (i in 1:nrow(df)) {
df$Fraction[i] <- round(sum(df[i, 2:9], na.rm=F)/8, 2)
# I have used only one of the following at one time
df$Percent[i] <- prop.table(as.array(df$Fraction[i]), margin= 2) *100
df$Percent[i] <- df$Fraction[i] * 100
}
答案 0 :(得分:3)
我们可以使用for
rowSums
循环
df$Fraction <- rowSums(df[2:9], na.rm=TRUE)/8
df$Percent <- 100*df$Fraction
或者正如@ColonelBeauvel所提到的,rowMeans
将更加紧凑和恰当。
df$Fraction <- rowMeans(df[2:9], na.rm=TRUE)
答案 1 :(得分:1)
以下代码对我来说非常适合
df$Fraction <- NA
df$Percent <- NA
for (i in 1:nrow(df)) {
df$Fraction[i] <- round(sum(df[i, 2:9], na.rm=F)/8, 2)
}
df$Percent <- df$Fraction * 100
# Alternative
df$Frac <- round(rowSums(df[2:9], na.rm=T)/8, 2)
df$Percent <- 100*df$Frac
我找到了两个我发布的问题的解决方案。
1。我可以取消引用我已分配的NA
,因此整列变为logical
,因此我可以计算百分比(或将列乘以100 )。
2。如果我引用as.numeric
,我可以使用'NA'
。
感谢。
答案 2 :(得分:0)
Fraction
变量不是数字。
试试这个
df$Fraction <- as.numeric(df$Fraction) * 100