【问题标题】:Operation on multiple(70) columns by another column in RR中的另一列对多个(70)列的操作
【发布时间】:2015-04-06 18:55:27
【问题描述】:

对于以下数据,我希望每一列都替换为(除以)--> /对应长度。(即A/len, B/len, C/len,.. .)

... 表示更多列,最多 70 列。 由于这有很多列,应该如何进行?

 A    B    C     D    E     F   ...   len

 2    4    5     7    8     8          5
 5    8    3     1    0     4          6
 8    9    3     9    6     2          12
 2    6    2     6    7     8          10
 1    2    4     2    9     5          20

【问题讨论】:

标签: r data.table dplyr


【解决方案1】:

如果您的数据框 df 与您显示的完全一样,您可以这样做

df[-ncol(df)] / df$len

如果您有其他列要排除,并且您希望它们全部包含在结果中,您可以执行类似的操作

with(df, cbind(ID, df[!names(df) %in% c("ID", "len")]/len, len))
#   ID         A        B    C         D    E         F len
# 1  1 0.4000000 0.800000 1.00 1.4000000 1.60 1.6000000   5
# 2  2 0.8333333 1.333333 0.50 0.1666667 0.00 0.6666667   6
# 3  3 0.6666667 0.750000 0.25 0.7500000 0.50 0.1666667  12
# 4  4 0.2000000 0.600000 0.20 0.6000000 0.70 0.8000000  10
# 5  5 0.0500000 0.100000 0.20 0.1000000 0.45 0.2500000  20

另外,正如大卫在 cmets 中所建议的,您可以使用 data.table

library(data.table)
x <- c(1L, ncol(df))
setDT(df)[, names(df)[-x] := lapply(.SD, "/", df$len), .SDcols = -x]

导致

#    ID         A        B    C         D    E         F len
# 1:  1 0.4000000 0.800000 1.00 1.4000000 1.60 1.6000000   5
# 2:  2 0.8333333 1.333333 0.50 0.1666667 0.00 0.6666667   6
# 3:  3 0.6666667 0.750000 0.25 0.7500000 0.50 0.1666667  12
# 4:  4 0.2000000 0.600000 0.20 0.6000000 0.70 0.8000000  10
# 5:  5 0.0500000 0.100000 0.20 0.1000000 0.45 0.2500000  20

df 在哪里

df <- read.table(text = "ID A    B    C     D    E     F   len
1  2    4    5     7    8     8    5
2  5    8    3     1    0     4    6
3  8    9    3     9    6     2   12
4  2    6    2     6    7     8   10
5  1    2    4     2    9     5   20", header = TRUE)

【讨论】:

  • 您也可以使用data.table(虽然有点麻烦)通过引用进行更新,因为它被标记为data.tablesetDT(df)[, names(df)[-ncol(df)] := lapply(.SD, function(x) x / df$len), .SDcols = -"len"]
  • 如果我在“A”之前有一列“Id”,并且不想对其进行除法运算,那么?
  • 哦..这太简单了!
  • no..wait,这只是从我的表中排除了整个“Id”列,而我想要它在那里。
  • Richard,你也可以用cbind修改我的提议,就像你用with做的一样...
猜你喜欢
  • 1970-01-01
  • 2018-10-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 2021-06-07
  • 2016-11-06
  • 2016-05-12
  • 2022-09-30
相关资源
最近更新 更多