【问题标题】:R: Create matrix of values from other tableR:从其他表创建值矩阵
【发布时间】:2016-04-06 22:48:48
【问题描述】:

我有以下数据框,table5,由 x 及其频率组成,由使用 counts 的其他数据产生:

  x freq
1 1    3
2 3   21
3 4   21
4 5 1345
5 7    1

我想以一般方式,即与原始数据帧中的其他值一起使用 - 转移到以下数据帧 table5if

      Frequency
3             21
4             21
5             1345
other         4

即其中数字 3、4 和 5 的频率是直接转移的,所有其他数字在other 中相加。我最近的尝试是这样的:

k <- seq(1, nrow(table5), by=1)
    ifelse(table5$x[k] == 3, table5if[1] <- table5$freq[k],
          ifelse(table5$x[k] == 4, table5if[2] <- table5$freq[k],
                ifelse(table5$x[k] == 5, table5if[3] <- table5$freq[k], table5if[4] <- (table5if[4] + table5$freq[k])
                  )
            )
      )

此尝试以及使用if(...){...} else {...} etc. 的其他尝试都产生了某种形式的警告或错误(例如“要替换的项目数...”和“维数...”并且没有产生任何令人信服的结果。我已经查看了无数其他关于错误/警告的问题,但无法完全找到我正在寻找的内容 - 关于矢量化的内容很多,但我无法完全理解为什么会出现这样的问题. 谁能为这个小任务推荐一个合适的选项?

【问题讨论】:

  • 为什么不把所有的频率相加,然后减去数字 3、4 和 5 的频率来计算其他频率的总数?
  • 这肯定是最简单的选择!我也很喜欢避免现成的函数并将其归结为数学和逻辑。非常感谢您的建议,windrunn3r.1990!

标签: r if-statement matrix dataframe transfer


【解决方案1】:

我将按factor(x, levels = 3:5) 聚合,而所有不存在的级别将变为NA。然后,您可以根据需要将其更改为 "other"data.table 在这种情况下很方便,因为它将 NAs 保留在一个单独的组中,而不是忽略它们

library(data.table)
setDT(df)[, .(Frequency = sum(freq)), by = factor(x, levels = 3:5)]
#    factor Frequency
# 1:     NA         4
# 2:      3        21
# 3:      4        21
# 4:      5      1345

【讨论】:

  • 这也很有效!非常感谢,大卫·阿伦伯格。
【解决方案2】:

base R 选项将基于带有%in% 的“x”列的值创建逻辑索引。我们根据'i1'的否定索引和rbind与'table5'的子集行得到'freq'的sum

i1 <- table5$x %in% 3:5
`row.names<-`(rbind(table5[i1,], list(x= "Other", 
          freq=sum(table5[!i1,"freq"]))), NULL)
#      x freq
#1     3   21
#2     4   21
#3     5 1345
#4 Other    4

【讨论】:

  • 这绝对是一种享受!我已经使用 table5 中的操纵值对其进行了测试,没有任何问题。 +10 街头信誉,阿克伦!非常感谢。
猜你喜欢
  • 2020-09-27
  • 1970-01-01
  • 2020-11-24
  • 1970-01-01
  • 2019-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-04
相关资源
最近更新 更多