用R中的条件替换n行?

时间:2018-02-19 19:40:15

标签: r

我有一个df:

number=c(3,3,3,3,3,1,1,1,1,4,4,4,4,4,4)
data.frame(number)

但有数千行。

如何将n行数替换为更多行,例如将3变为1。

如果你能解释这个逻辑也会很棒。

没有特殊要求只需将一定数量的3替换为1.并非全部。

随机或前n个数字。

2 个答案:

答案 0 :(得分:1)

以下是两个版本。第一个假设您随机想要将n行从3转换为1.第二个假定您要选择从3到1的第一个n行。

要随机选择当前值为3的行的n,然后转换为1:

> number=c(3,3,3,3,3,1,1,1,1,4,4,4,4,4,4)
> 
> 
> # to randomly change n rows (assume here that n = 4)
> set.seed(1)
> df <- data.frame(v1 = number)
> df$v1[sample(which(df$v1 == 3), 4)] <- 1
> df
   v1
1   1
2   1
3   1
4   1
5   3
6   1
7   1
8   1
9   1
10  4
11  4
12  4
13  4
14  4
15  4

要更改为第一行n(再次假设n = 4):

> df <- data.frame(v1 = number)
> df$v1[which(df$v1 == 3)[1:4]] <- 1
> df
   v1
1   1
2   1
3   1
4   1
5   3
6   1
7   1
8   1
9   1
10  4
11  4
12  4
13  4
14  4
15  4

由于您需要有关其工作原理的逻辑:

两个答案都依赖于which()命令。这将为您提供向量为TRUE的位置,因此当我们执行which(df$v1 == 3)时,这将为我们提供df$v13的所有行的位置:

> df$v1 == 3
 [1]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
> which(df$v1 == 3)
[1] 1 2 3 4 5

然后我们只是指定我们要将df$v1重新分配给这些位置为1.但是,由于您要指定要执行此操作的行数,因此我们将which()向量的结果进行子集化使用[1:n]选择前n个结果,或sample(x, n)随机选择n个结果。

答案 1 :(得分:0)

我假设您要在data.frame列中选择n某些值的外观。

为此,您可以在有或没有替换的情况下对符合您要求的所有值进行抽样。

下面我将展示如何为3个3的实例

执行此操作
number =c (3,3,3,3,3,1,1,1,1,4,4,4,4,4,4)
foo = data.frame(number)

indexes = sample(which(foo$number == 3), size = 3, replace = F)
foo$number[indexes] = 'your value'