乘以列中具有特定值的行数

发布于 2025-01-19 07:33:01 字数 548 浏览 0 评论 0原文

我有包含一些行和列的数据,例如

     col1   col2   col3   col4
r1   A      1      1       2
r2   B      3      1       2
r3   A      4      1       2
r4   D     10      1       2
r5   E     12      1       2
r6   A     5       1       2

我想将 col1 中具有值 A 或 B 的行乘以特定值(例如三个),

所以结果将是

     col1   col2   col3   col4
r1   A      3      3       6
r2   B      9      3       6
r3   A     12      3       6
r4   D     10      1       2
r5   E     12      1       2
r6   A     15      3       6

谢谢

I have data that contain some rows and columns like this for example

     col1   col2   col3   col4
r1   A      1      1       2
r2   B      3      1       2
r3   A      4      1       2
r4   D     10      1       2
r5   E     12      1       2
r6   A     5       1       2

i want to multiply by specefic value (three for example) the rows that have value A or B in col1

so the result will be

     col1   col2   col3   col4
r1   A      3      3       6
r2   B      9      3       6
r3   A     12      3       6
r4   D     10      1       2
r5   E     12      1       2
r6   A     15      3       6

Thank you

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

℉服软 2025-01-26 07:33:01

你可以做到,

df[df$col1 == 'A', -1] <- df[df$col1 == 'A', -1] * 3

You can simply do,

df[df$col1 == 'A', -1] <- df[df$col1 == 'A', -1] * 3
南街女流氓 2025-01-26 07:33:01

data.table 解决方案

library(data.table)
DT <- fread("col1   col2   col3   col4
   A      1      1       2
   B      3      1       2
   A      4      1       2
   D     10      1       2
   E     12      1       2
   A     5       1       2")

cols <- names(DT)[-1]
DT[col1 == "A", (cols) := lapply(.SD, `*`, 3), .SDcols = cols][]

#    col1 col2 col3 col4
# 1:    A    3    3    6
# 2:    B    3    1    2
# 3:    A   12    3    6
# 4:    D   10    1    2
# 5:    E   12    1    2
# 6:    A   15    3    6

data.table solution

library(data.table)
DT <- fread("col1   col2   col3   col4
   A      1      1       2
   B      3      1       2
   A      4      1       2
   D     10      1       2
   E     12      1       2
   A     5       1       2")

cols <- names(DT)[-1]
DT[col1 == "A", (cols) := lapply(.SD, `*`, 3), .SDcols = cols][]

#    col1 col2 col3 col4
# 1:    A    3    3    6
# 2:    B    3    1    2
# 3:    A   12    3    6
# 4:    D   10    1    2
# 5:    E   12    1    2
# 6:    A   15    3    6
风吹短裙飘 2025-01-26 07:33:01

1)dplyr 我们可以跨在dplyr中使用,或用 将第一个参数替换为其中(is.numeric):

library(dplyr)

DF %>% mutate(across(-col1, ~ ifelse(col1 %in% c("A", "B"), 3 * ., .)))

给予:

  col1 col2 col3 col4
1    A    3    3    6
2    B    9    3    6
3    A   12    3    6
4    D   10    1    2
5    E   12    1    2
6    A   15    3    6

2)Collapse 或者在倒塌软件包中使用ftransformv

library(collapse)

ftransformv(DF, is.numeric, \(x) ifelse(DF$col1 %in% c("A", "B"), 3*x, x))

笔记

Lines <- "col1   col2   col3   col4
   A      1      1       2
   B      3      1       2
   A      4      1       2
   D     10      1       2
   E     12      1       2
   A     5       1       2"
DF <- read.table(text = Lines, header = TRUE)

1) dplyr We can use across in dplyr or replace the first argument to across with where(is.numeric) :

library(dplyr)

DF %>% mutate(across(-col1, ~ ifelse(col1 %in% c("A", "B"), 3 * ., .)))

giving:

  col1 col2 col3 col4
1    A    3    3    6
2    B    9    3    6
3    A   12    3    6
4    D   10    1    2
5    E   12    1    2
6    A   15    3    6

2) collapse Alternatively use ftransformv in the collapse package.

library(collapse)

ftransformv(DF, is.numeric, \(x) ifelse(DF$col1 %in% c("A", "B"), 3*x, x))

Note

Lines <- "col1   col2   col3   col4
   A      1      1       2
   B      3      1       2
   A      4      1       2
   D     10      1       2
   E     12      1       2
   A     5       1       2"
DF <- read.table(text = Lines, header = TRUE)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文