使用 sample() 创建一个新的 data.frame 变量,最大 sample() 值因行而异
Creating a new data.frame variable using sample(), with maximum sample() value differing by row
我有一个 12071 行的数据框 foo
。我正在尝试,对于 foo
的每一行,基于 1:K 生成一个随机值,并将其插入到新列 L 中。例如,第一行的 L 值应为在 1 和 5 之间,第二个应该给出 1 和 9 之间的值,第三个应该在 1 和 3 之间,依此类推。这些值必须是整数,因此我尝试使用 sample()
。在每一行内,范围内的任何整数都有相等的选择概率。
我已经减少了代码中的列数,因为它们是不相关的,而且我在示例中遇到了数据换行问题。 A 列和 K 列链接在一起,因此 A 列中的字符串在 K 列中始终具有相同的值。存在重复的 A/K 组合,因为 A 列值不唯一。
数据(列减少):
A B C D E F G ... K
A011100 F 7 Partnered 4 40-49 Hrs 0.04075 5
A011200 M 7 Partnered 4 40-49 Hrs 0.13334 9
A011400 F 8 Non-partnered 2 30-39 Hrs 0.02310 3
A011500 F 4 Non-partnered 4 1-9 Hrs 0.94519 4
A012100 M 8 Partnered 4 40-49 Hrs 0.78114 4
我的代码无法运行。对于 data.frame 中的每一行,我无法计算出将新的最大值传递给 sample()
的逻辑,并在每一行中正确构造它。
我尝试了以下方法:
foo$L <- lapply(foo, sample(1:foo$K,1))
那给了:
Error in match.fun(FUN) :
'sample(1:foo$K, 1)' is not a function, character or symbol
In addition: Warning message:
In 1:foo$K :
numerical expression has 12071 elements: only the first used
然后
foo$L <- lapply(foo, function(x) sample(1:foo$K,1))
错误是:
Error in $<-.data.frame
(*tmp*
, L, value = list(A = 1L, :
replacement has 12 rows, data has 12071
In addition: There were 12 warnings (use warnings() to see them)
然后
foo$L <- replicate(nrow(foo), sample(foo, 1:foo$K,1))
这给了
There were 50 or more warnings (use warnings() to see the first 50)
我们可以 sample
使用 sapply
df$L <- sapply(df$K, function(x) sample(x, 1))
# A B C K L
#1 A011100 F 7 5 1
#2 A011200 M 7 9 7
#3 A011400 F 8 3 2
#4 A011500 F 4 4 2
#5 A012100 M 8 4 1
取自?sample
If x has length 1, is numeric (in the sense of is.numeric) and x >= 1, sampling via sample takes place from 1:x.
因此,对于 df$K
的每个值,我们从 sapply
中的 1:x
中对其进行采样,然后 select 从这些值中随机抽取一个。
PS - 为了简单和更好的可见性,我进一步减少了列。
我认为 Ronak Shah 的回答比我的好,但对于 dplyr
解决方案,请尝试:
library(dplyr)
desired_df <- mutate(rowwise(foo), L = sample(K,1))
输出:
A B C D E F G K L
A011100 F 7 Partnered 4 40-49 Hrs 0.04075 5 4
A011200 M 7 Partnered 4 40-49 Hrs 0.13334 9 7
A011400 F 8 Non-partnered 2 30-39 Hrs 0.02310 3 1
A011500 F 4 Non-partnered 4 1-9 Hrs 0.94519 4 3
A012100 M 8 Partnered 4 40-49 Hrs 0.78114 4 1
我有一个 12071 行的数据框 foo
。我正在尝试,对于 foo
的每一行,基于 1:K 生成一个随机值,并将其插入到新列 L 中。例如,第一行的 L 值应为在 1 和 5 之间,第二个应该给出 1 和 9 之间的值,第三个应该在 1 和 3 之间,依此类推。这些值必须是整数,因此我尝试使用 sample()
。在每一行内,范围内的任何整数都有相等的选择概率。
我已经减少了代码中的列数,因为它们是不相关的,而且我在示例中遇到了数据换行问题。 A 列和 K 列链接在一起,因此 A 列中的字符串在 K 列中始终具有相同的值。存在重复的 A/K 组合,因为 A 列值不唯一。
数据(列减少):
A B C D E F G ... K
A011100 F 7 Partnered 4 40-49 Hrs 0.04075 5
A011200 M 7 Partnered 4 40-49 Hrs 0.13334 9
A011400 F 8 Non-partnered 2 30-39 Hrs 0.02310 3
A011500 F 4 Non-partnered 4 1-9 Hrs 0.94519 4
A012100 M 8 Partnered 4 40-49 Hrs 0.78114 4
我的代码无法运行。对于 data.frame 中的每一行,我无法计算出将新的最大值传递给 sample()
的逻辑,并在每一行中正确构造它。
我尝试了以下方法:
foo$L <- lapply(foo, sample(1:foo$K,1))
那给了:
Error in match.fun(FUN) : 'sample(1:foo$K, 1)' is not a function, character or symbol In addition: Warning message: In 1:foo$K : numerical expression has 12071 elements: only the first used
然后
foo$L <- lapply(foo, function(x) sample(1:foo$K,1))
错误是:
Error in
$<-.data.frame
(*tmp*
, L, value = list(A = 1L, : replacement has 12 rows, data has 12071 In addition: There were 12 warnings (use warnings() to see them)
然后
foo$L <- replicate(nrow(foo), sample(foo, 1:foo$K,1))
这给了
There were 50 or more warnings (use warnings() to see the first 50)
我们可以 sample
使用 sapply
df$L <- sapply(df$K, function(x) sample(x, 1))
# A B C K L
#1 A011100 F 7 5 1
#2 A011200 M 7 9 7
#3 A011400 F 8 3 2
#4 A011500 F 4 4 2
#5 A012100 M 8 4 1
取自?sample
If x has length 1, is numeric (in the sense of is.numeric) and x >= 1, sampling via sample takes place from 1:x.
因此,对于 df$K
的每个值,我们从 sapply
中的 1:x
中对其进行采样,然后 select 从这些值中随机抽取一个。
PS - 为了简单和更好的可见性,我进一步减少了列。
我认为 Ronak Shah 的回答比我的好,但对于 dplyr
解决方案,请尝试:
library(dplyr)
desired_df <- mutate(rowwise(foo), L = sample(K,1))
输出:
A B C D E F G K L
A011100 F 7 Partnered 4 40-49 Hrs 0.04075 5 4
A011200 M 7 Partnered 4 40-49 Hrs 0.13334 9 7
A011400 F 8 Non-partnered 2 30-39 Hrs 0.02310 3 1
A011500 F 4 Non-partnered 4 1-9 Hrs 0.94519 4 3
A012100 M 8 Partnered 4 40-49 Hrs 0.78114 4 1