数学函数使用多个匹配条件

时间:2016-09-21 20:32:21

标签: r

我是新手,但我很确定这个问题没有得到解答,或者我只是不擅长搜索....

我想根据匹配的列和值从特定行中减去多行中的值。我的实际数据将是一个包含> 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函数可以使用单个列执行此类操作,但我无法扩展它以执行多个列的此任务。我虽然是一个菜鸟......

感谢您的帮助!

2 个答案:

答案 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;在初始数据结构中,这将使这更简单;但这是你的选择。