【问题标题】:Subtract number from matrix in R when condition holds当条件成立时,从 R 中的矩阵中减去数字
【发布时间】:2014-03-21 04:37:49
【问题描述】:

我知道如何对从文件中读取的表进行一些转换:

data = read.table(file, sep=" ", header=TRUE, stringsAsFactors=F)
data_transformed=cbind(data[, 1], round(
        data[, seq(from = 3, to = ncol(data), by = 3)] *100 /
        data[, seq(from = 2, to = ncol(data), by = 3)], digits=2))

以及如何将“Inf”替换为“0”。

data_transformed[data_transformed==Inf] <- 0

现在,我需要将每个大于 100 的数字替换为 (value-2*(value-100)),这样 130 将被 70 替换,110 将被 90 替换。

我正在使用以下代码,但它不起作用:

data_transformed[data_transformed>100] <- (data_transformed-2*(data_transformed-100))

有什么建议可以解决吗?非常感谢。

我收到此错误:

Error in rowMeans(data_transformed, na.rm = TRUE) : 'x' must be numeric

【问题讨论】:

  • 您在这里没有可重现的问题(而且我看不出如何调用 rowMeans),但我可以告诉您,您需要确保 RHS 上的向量正是[.] 中条件表达式的 TRUE 值的长度。如果该 data.frame 具有任何因子或字符值,您也可能无法正确执行此操作......所以您确实需要查看str(data_transformed)

标签: r if-statement matrix subtraction


【解决方案1】:

我相信您复制了错误的错误声明。很可能会收到此警告:

Warning message:
In data_transformed[data_transformed > 100] <- data_transformed -  :
  number of items to replace is not a multiple of replacement length

正如@IShouldBuyABoat 在评论中提到的那样。您在 LHS 上有一个过滤器 data_transformed &gt; 100,但在 RHS 上没有过滤器。请参阅此代码:

set.seed(1)
data <- matrix(round(rbinom(210, 3, .5) * 100), ncol = 21)
head(data)

data_transformed <- cbind(data[, 1],
  round(data[, seq(from = 3, to = ncol(data), by = 3)] * 100 /
        data[, seq(from = 2, to = ncol(data), by = 3)], digits = 2))
head(data_transformed)

data_transformed[data_transformed == Inf] <- 0
head(data_transformed)

a <- data_transformed > 100
a

# data_transformed[data_transformed > 100] <-
#   data_transformed - 2 * (data_transformed - 100)

data_transformed[a] <-
  data_transformed[a] - 2 * (data_transformed[a] - 100)

head(data_transformed)

【讨论】:

    猜你喜欢
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 2014-08-22
    • 2013-06-23
    • 2018-10-14
    相关资源
    最近更新 更多