我是新手,但我很确定这个问题没有得到解答,或者我只是不擅长搜索....
我想根据匹配的列和值从特定行中减去多行中的值。我的实际数据将是一个包含> 5000列的大型矩阵,每个列需要减去一个与因子列中的a值匹配的空白值。
以下是一个示例数据表:
c1 c2 c3 c4 c5
r1 A 1 2 3 aa
r2 B 2 3 4 bb
r3 C 3 4 5 aa
r4 D 4 1 6 bb
r5 Blank 2 3 4 aa
r6 Blank 3 4 5 bb
我想减去c1 ="空白"的c2,c3和c4值。 A,B和C中的行使用c5因子来定义使用哪个Blank值(aa或bb)。我想要"空白"要从共享c5信息的所有行中减去的值。 (我知道这很容易描述)
所以结果如下:
c1 c2 c3 c4 c5
r1 A -1 -1 -1 aa
r2 B -1 -1 -1 bb
r3 C 1 1 1 aa
r4 D 1 -3 1 bb
我已经看到ddply函数可以使用单个列执行此类操作,但我无法扩展它以执行多个列的此任务。我虽然是一个菜鸟......
感谢您的帮助!
答案 0 :(得分:1)
这并没有针对所有可能的情况进行测试,但应该给你一个想法:
df <- read.table(text =
"c1 c2 c3 c4 c5
r1 A 1 2 3 aa
r2 B 2 3 4 bb
r3 C 3 4 5 aa
r4 D 4 1 6 bb
r5 Blank 2 3 4 aa
r6 Blank 3 4 5 bb", header = T)
library(data.table)
# separate dataset into two
dt <- data.table(df, key = "c5")
dt.blank <- dt[c1 == "Blank"]
dt <- dt[c1 != "Blank"]
# merge into resulting dataset
dt.res <- dt[dt.blank]
# update each column
columns.count <- ncol(dt)
for(i in 2:(columns.count-1)) {
dt.res[[i]] <- dt.res[[i]] - dt.res[[i + columns.count]]
}
# > dt.res
# c1 c2 c3 c4 c5 i.c1 i.c2 i.c3 i.c4
# 1: A -1 -1 -1 aa Blank 2 3 4
# 2: C 1 1 1 aa Blank 2 3 4
# 3: B -1 -1 -1 bb Blank 3 4 5
# 4: D 1 -3 1 bb Blank 3 4 5
答案 1 :(得分:0)
首先拆分数据,因为没有理由将它们放在单个数据结构中。然后应用函数:
mtx
运行循环有一些不同之处,包括矢量化。但这就足够了。我也认为没有理由保留标签&#34; aa&#34; v&#34; bb&#34;在初始数据结构中,这将使这更简单;但这是你的选择。