我有一个数据框(总数)如下:
ID pos ori cont mA1 nmA1 bdA1 mA2 nmA2 bdA2 mB1 nmB1 bdB1 mB2
1: ChrM 5 + CCG 0 1 2 0 1 2 0 4 5 0
2: ChrM 6 + CGT 0 1 2 2 0 0 2 2 2 1
3: ChrM 7 - CGG 0 1 2 0 6 7 0 3 4 1
4: ChrM 10 + CGA 0 2 3 2 1 2 2 3 2 1
5: ChrM 11 - CGA 0 1 2 2 6 2 0 3 4 1
---
164264: ChrM 366914 + CAA 0 1 2 0 2 3 0 1 2 0
164265: ChrM 366918 + CCG 0 1 2 0 2 3 0 0 1 0
164266: ChrM 366919 + CGG 0 1 2 0 2 3 0 0 1 0
164267: ChrM 366920 - CGG 1 2 2 0 5 6 0 1 2 0
164268: ChrM 366921 - CCG 0 3 4 0 3 4 0 0 1 0
nmB2 bdB2
1: 5 6
2: 6 3
3: 3 2
4: 7 3
5: 8 3
---
164264: 8 9
164265: 7 8
164266: 7 8
164267: 4 5
164268: 4 5
我想要一个功能来评估几个标准。当我一个接一个地使用
时total$critA <- as.numeric((total$mA1+total$nmA1>=4)&(total$nmA1>=bdA1))
所以如果为真,我得到0,如果为假则得到1。我想将它应用于所有治疗(A1(m,nm和bd),A2,A3等)。
我对R来说真的很陌生,并且还没有想出如何做一堆东西,所以任何帮助都非常感谢。谢谢!
答案 0 :(得分:0)
我认为是这样的:(如果您与dput
共享数据我会复制/粘贴它并测试... see here以获取有关编写良好,可重现的R问题的其他提示。
add_crit = function(data, treatment) {
m_name = paste0("m", treatment)
nm_name = paste0("nm", treatment)
bd_name = paste0("bd", treatment)
crit_name = paste0("crit", treatment)
data[crit_name] = as.numeric(
(data[m_name] + data[nm_name] >= 4) & (data[nm_name] >= data[bd_name])
)
return(data)
}
treatments = c("A1", "A2", "B1", "B2")
data_with_crit = total
for (trt in treatments) {
data_with_crit = add_crit(data_with_crit, trt)
}
我使用paste
将您需要的列名称构建为字符串。当列名存储在变量中时,您需要使用[
而不是$
,否则它们也可以正常工作。
fortunes::fortune(343)
大多数R初学者迟早都被这个太方便的捷径所咬。作为R新手, 将R视为您的银行帐户:过度使用
$
- 提取可能会导致不良后果。 最好早点获得'[['
和'['
习惯。 - Peter Ehlers(关于$ -extraction的使用) R-help(2013年3月)
处理这个问题的另一种(更普遍的)方式是&#34;融化&#34;您的数据格式为长格式 - 您将拥有一个treatment
列,其值为A1, A2, ...
,然后是m
,nm
,bd
,{{1 }}。每个id多行(每个id每个处理一行)。这将适用于crit
或data.table
解决方案。也许其他人会发布一个例子。