[ ]
]
1I need to create column C in a data frame where 30% of the rows within each group (column B) get a value 0.
How do I do this in R?
[ ]
]
1I need to create column C in a data frame where 30% of the rows within each group (column B) get a value 0.
How do I do this in R?
 
    
    We may use rbinom after grouping by 'category' column.  Specify the prob as a vector of values
library(dplyr)
df1 %>%
    group_by(category) %>%
    mutate(value = rbinom(n(), 1, c(0.7, 0.3))) %>%
    ungroup
-output
# A tibble: 9 x 3
    sno category value
  <int> <chr>    <int>
1     1 A            1
2     2 A            0
3     3 A            1
4     4 B            1
5     5 B            0
6     6 B            1
7     7 C            1
8     8 C            0
9     9 C            0
df1 <- structure(list(sno = 1:9, category = c("A", "A", "A", "B", "B", 
"B", "C", "C", "C")), class = "data.frame", row.names = c(NA, 
-9L))
 
    
    If your data already exist (assuming this is a simplified answer), and if you want the value to be randomly assigned to each group:
library(dplyr)
d <- data.frame(sno = 1:9,
                category = rep(c("A", "B", "C"), each = 3))
d %>%
  group_by(category) %>%
  mutate(value = sample(c(rep(1, floor(n()*.7)), rep(0, n() - floor(n()*.7)))))
 
    
    set.seed(42)
d$value <- ave(
  rep(0, nrow(d)), d$category,
  FUN = function(z) sample(0:1, size = length(z), prob = c(0.3, 0.7), replace = TRUE)
)
d
#   sno category value
# 1   1        A     0
# 2   2        A     0
# 3   3        A     1
# 4   4        B     0
# 5   5        B     1
# 6   6        B     1
# 7   7        C     0
# 8   8        C     1
# 9   9        C     1
Data copied from Brigadeiro's answer:
d <- structure(list(sno = 1:9, category = c("A", "A", "A", "B", "B", "B", "C", "C", "C")), class = "data.frame", row.names = c(NA, -9L))
