我有一个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个数字。
答案 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$v1
为3
的所有行的位置:
> 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'