1

在 R 中正确的做法是:

for(row in 1:10)
{
 counts[row] <- length(otherData[otherData[["some property"]] == otherList[row],])
}

换句话说,在一个新的任何东西(矩阵、data.frame 等)的每一行中放入另一个东西(矩阵、data.frame 等)中与其他列表中的相应条目相等的那些行的计数(再次抽象地说,不是字面上列出对象)?

例如说 x = otherData 是

   a   b   c
d  1   2   3
e  1   3   4
f  2   5   6
g  1   5   3

并说“otherList”是x的第一列,所以我想先计算有多少x的行有1、2、3等

所以我想要计数

3,
1,
0,
(0s as long as this counts list goes)

请注意,我能够选择出该数据子集比获得它的长度更重要;我还需要将该子集用于其他计算,尽管再次想逐行选择它并将我所做的任何计算的输出存储在结果(在本例中为计数)矩阵的行中。

我显然可以用 for 循环来做到这一点,但是跳过循环的聪明方法是什么?

如果这重复了另一个问题,我们深表歉意。这似乎是一个非常基本的问题,但我不确定要搜索哪些术语。这个问题似乎很相似,并且可以延长长度,尽管我不清楚如何在一般情况下应用它。

编辑

这是一个例子。我们选择满足某些行相关条件的 x 的某些行(这里 x 就像我上面的描述中的 otherData),在这种情况下,第一个 col 条目 = 到行,但关键是可以替换“== 行”行上的任何条件,例如“<= otherlist[row]-2”等。

> x
   condition value
1          2    25
2          9    72
3         41    60
4         41    61
5         25    38
6         41    10
7         41    43
8         41    26
9         41    46
10        12   263
11        26   136
12        24   107
13         9    70
14        12    62
15        12   136
16        34    44
17        12    53
18        32    14
19        32   148
20         4    34

> results = 0*1:20
> results
 [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
> for(row in 1:20) {
+ results[row] = length(x[x[["condition"]]==row,2]) }
> results
 [1] 0 1 0 1 0 0 0 0 2 0 0 4 0 0 0 0 0 0 0 0
4

3 回答 3

2

编辑:

sapply( 1:20, function(z) sum(x[["condition"]] == z) )
#[1] 0 1 0 1 0 0 0 0 2 0 0 4 0 0 0 0 0 0 0 0

您将能够替换不同的逻辑测试,总和将是符合条件的行数。(我永远无法弄清楚您为什么使用第 2 列。)如果您希望选择满足条件的行子集(您的示例未说明),那么您可以使用它:

x[ x[,1] == test , ]  " e.g.

> x[ x$condition == 9, ]
   condition value
2          9    72
13         9    70

或者,如果您只想要与测试的“条件”列对应的“值”列,请使用:

>  x[ x[['condition']] == 9, "value" ]
[1] 72 70

如果您想将函数应用于选定的(不相交的)子集,x并且您可以创建一个与数据框一样长的因子变量,那么您可以使用aggregateby处理拆分列表。如果您想使用上面的形式,这里有一个示例,它为具有“条件”sapply的行计算“值”子集的单独均值:rownames

> sapply( rownames(x), function(z) mean( x[x[["condition"]] == z , "value"]) )
 [1]   NaN  25.0   NaN  34.0   NaN   NaN   NaN   NaN  71.0   NaN   NaN 128.5   NaN   NaN   NaN   NaN
[17]   NaN   NaN   NaN   NaN
于 2012-06-25T15:29:18.477 回答
1

怎么样table

table(factor(x[, 1], x[1, ]))
# 
# 1 2 3 
# 3 1 0

更新

在您的问题中使用第二个x表格,相同的解决方案:

table(factor(x$condition, rownames(x)))
# 
# 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 
# 0  1  0  1  0  0  0  0  2  0  0  4  0  0  0  0  0  0  0  0

另外,尝试match

match(x$condition, rownames(x))
# [1]  2  9 NA NA NA NA NA NA NA 12 NA NA  9 12 12 NA 12 NA NA  4
table(match(x$condition, rownames(x)))
# 
# 2  4  9 12 
# 1  1  2  4
于 2012-06-25T15:16:15.513 回答
0
> a <- c(seq(1,10))
> a
 [1]  1  2  3  4  5  6  7  8  9 10
> d <- cbind(a,a)
> d
       a  a
 [1,]  1  1
 [2,]  2  2
 [3,]  3  3
 [4,]  4  4
 [5,]  5  5
 [6,]  6  6
 [7,]  7  7
 [8,]  8  8
 [9,]  9  9
[10,] 10 10
> d[,2]
 [1]  1  2  3  4  5  6  7  8  9 10
> d[,2] <- d[,1]*2
> d
       a  a
 [1,]  1  2
 [2,]  2  4
 [3,]  3  6
 [4,]  4  8
 [5,]  5 10
 [6,]  6 12
 [7,]  7 14
 [8,]  8 16
 [9,]  9 18
[10,] 10 20
> 
于 2012-06-25T14:41:32.760 回答