如何创建一个新列,其中的值比前一列的值要小。

3
我试图创建一个新列,该列的值是使用列A中的值作为样本的上限所形成的。我尝试了以下方法,但没有成功。有任何建议吗?假设值 A 是 15.25,然后我想生成一个在 1 和 15.25 之间的值,这些值按 1/4 的间隔进行分割。
my_data = data.frame(A = sample(seq(1, 20, 1/4), 10))
my_data %>% mutate(B = sample(seq(1, A, 1/4), 1))
2个回答

4
你可以使用rowwise函数,以逐行的方式对数据框进行计算。否则,在你需要指定上限为1的情况下,它将会在整个A列中进行抽样。
my_data %>% 
  rowwise() %>%
  mutate(B = sample(seq(1, A, 1/4), size = 1))

# A tibble: 10 × 2
# Rowwise: 
       A     B
   <dbl> <dbl>
 1 19     9.25
 2  8     6.25
 3  7.25  1.5 
 4  3.25  2.75
 5  2.75  2.25
 6 11     4   
 7 14.8  13   
 8  9.25  7.75
 9 10     9   
10 10.5   8.25

1
非常有趣。我想不到为什么要使用rowwise()。你能解释一下为什么在这里使用rowwise()吗? - Ramakrishna S
正如我在答案中指定的那样,您只需要将A的一个值放入seq中即可生成等间距数字序列。rowwise确保您逐行变异数据集,每次迭代都取一个A的值。而没有rowwiseseq中的A是整个列A,而不仅仅是一个值。 - Anoushiravan R
1
再次回来了! - TarJae
哈哈哈,你好吗,我的朋友?我正在尝试挑战自己的Python问题,但有时候我会回到我的舒适区 :) - Anoushiravan R
这两者没有区别。我们是否需要在特定场合下使用rowwise()呢?mtcars %>% mutate(x = hp*2)mtcars %>% rowwise() %>% mutate(x = hp*2) - Ramakrishna S
没错。因为在这两个代码块中,您都想将hp乘以2。因此,无论是一次性将整个hp向量相乘还是逐个相乘(速度较慢),都不会导致不同的结果。但是,在您的问题中,您需要单独考虑A的每个值,在您的seqsample操作中进行考虑。 - Anoushiravan R

3
一个基于R的解决方案:
set.seed(11) # for reproducibility
my_data <- data.frame(A = sample(seq(1, 20, 1/4), 10))

my_data$B <- sapply(my_data$A, \(x) sample(seq(1, x, 1/4), 1))

这将会得到:

> my_data
       A     B
1   9.25  9.25
2  14.75 13.00
3   7.00  2.75
4   4.75  4.50
5  10.00  2.25
6  15.75 12.25
7   3.75  1.50
8  16.25  9.50
9   9.50  5.25
10 10.50  3.75

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接