我有一個看起來像這樣的列名串列......
colnames(dat)
1 subject
2 e.type
3 group
4 boxnum
5 edate
6 file.name
7 fr
8 active
9 inactive
10 reward
11 latency.to.first.active
12 latency.to.first.inactive
13 act0.600
14 act600.1200
15 act1200.1800
16 act1800.2400
17 act2400.3000
18 act3000.3600
19 inact0.600
20 inact600.1200
21 inact1200.1800
22 inact1800.2400
23 inact2400.3000
24 inact3000.3600
25 rew0.600
26 rew600.1200
27 rew1200.1800
28 rew1800.2400
29 rew2400.3000
30 rew3000.3600
我想獲取列出行為#、非行為#和獎勵#的列的行總和
這作業...
for (row in 1:nrow(dat)) {
dat[row, "active"] = rowSums(dat[row,c(13:18)])
dat[row, "inactive"] = rowSums(dat[row,c(19:24)])
dat[row, "reward"] = rowSums(dat[row,c(25:30)])
}
但我不想對其進行硬編碼,因為 3 個部分的列數可能會發生變化。如何在不硬編碼列索引的情況下執行此操作?
另外,例如,我嘗試搜索名為“act”的列,但它也包括“active”列。
uj5u.com熱心網友回復:
sub_dat <- dat[, 13:30]
result <- sapply(split.default(sub_dat, substr(names(sub_dat), 1, 3)), rowSums)
dat[, c('active', 'inactive', 'reward')] <- result
uj5u.com熱心網友回復:
我舉了一個例子,如何做到這一點:
t <- data.frame(c(1,2,3),c("a","b","c"))
colnames(t) <- c("num","char")
#with function append() you make a list of rows that fulfill your logical argument
whichRows <- append(which(t$char == "a"),which(t$char == "b"))
sum(t$num[whichRows])
或者如果我誤解了你并且你想分別對每一列求和,那么:
sum(t$num[which(t$char == "a")])
sum(t$num[which(t$char == "b")])
uj5u.com熱心網友回復:
與女巫select和matches來自tidyverse.
library(tidyverse)
data %>%
mutate(
sum_act = rowSums(select(., matches("act[0-9]"))),
sum_inact = rowSums(select(., matches("inact[0-9]"))),
sum_rew = rowSums(select(., matches("rew[0-9]")))
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/358118.html
標籤:r
下一篇:根據其他日期列創建列
