【问题标题】:Row-wise percentage with RR 的逐行百分比
【发布时间】:2015-10-07 05:27:33
【问题描述】:

我有一个看起来像这样的数据框,但是是全年的

 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
}

【问题讨论】:

  • 检查分数的类别。这将是非数字的。您使用带引号的 NA 将列从数字转换为非数字。只需使用 NA 而不是字符 NA。
  • df$Fraction &lt;- as.numeric(df$Fraction) * 100
  • fraction 的类是character
  • 只需将df$Fraction &lt;- NA 作为您的第一行代码。连同df$Percent &lt;- NA。顺便说一句,您在这里不需要任何循环。可能,prop.table(round(rowSums(df[2:9], na.rm=TRUE)/8,2), margin=2)*100
  • 感谢@akrun 成功了

标签: r


【解决方案1】:

我们可以使用rowSums 来代替for 循环

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)

【讨论】:

  • @ShretaGhimire 抱歉,之前没有测试过。
  • 为什么不直接rowMeans
  • @ColonelBeauvel 您可以将其发布为答案。我只是想遵循与 OP 帖子中类似的逻辑。
  • 不用担心,您可以额外添加它以丰富您的答案。将避免一个简单问题的多个冗余答案;)
【解决方案2】:

以下代码非常适合我

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.如果我有引用'NA',我可以使用as.numeric

谢谢。

【讨论】:

    【解决方案3】:

    Fraction 变量不是数字。 试试这个

    df$Fraction &lt;- as.numeric(df$Fraction) * 100

    【讨论】:

    • 问题是由于拼写错误。
    • 问题是由@Pascal 列的class 引起的
    • 对。您可以通过在代码的第一行更改为 df$Fraction &lt;- NA_real_ 来解决这个问题。
    • 是的,因为您使用了'NA' 而不是NA
    • 是的。我也试过了。我的代码和解决方案中有很多问题:)。谢谢@Pascal
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多