按照其他列r的降序,对总 Dataframe 的n%的列进行变异

j2cgzkjk  于 2023-02-01  发布在  其他
关注(0)|答案(3)|浏览(105)

我有一个df

df <- data.frame(ID = c(1, 2, 3, 4, 5, 5, 7, 8),
                  var1 = c('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'),
                  var2 = c(1, 1, 0, 0, 1, 1, 0, 0),
                 var3 = c(50, 40, 30, 45, 33, 51, 70, 46))

我想使用以下命令将25%的 Dataframe 的var2修改为"0.3":

df %>%
  mutate(var2 = case_when(sample(n()) <= n()*0.25 ~ 0.3, 
    TRUE ~ var2
  ))

但是,我希望按 * var3 * 的降序选择25%的数据,以便输出为:

ID var1 var2 var3
1  1    a    1   50
2  2    b    1   40
3  3    c    0   30
4  4    d    0   45
5  5    e    1   33
6  5    f  0.3   51
7  7    g  0.3   70
8  8    h    0   46

其中,行IDS6和7已被修改,因为它们具有Var3的最高值和第二高值。它应该工作,以便我可以改变突变的百分比,但它们始终按Var3的降序应用。
先谢谢你

jjhzyzn0

jjhzyzn01#

这里有一个方法:

set.seed(42)
df %>%
  mutate(var2 = if_else(row_number() %in% sample(n(), size = ceiling(n()/4)), 0.3, var2))
#   ID var1 var2 var3
# 1  1    a  0.3   50
# 2  2    b  1.0   40
# 3  3    c  0.0   30
# 4  4    d  0.0   45
# 5  5    e  0.3   33
# 6  5    f  1.0   51
# 7  7    g  0.0   70
# 8  8    h  0.0   46
bqucvtff

bqucvtff2#

使用arrange的解决方案,然后返回到以前的顺序。

df %>%
  mutate(Row = row_number()) %>%
  arrange(desc(var3)) %>%
  mutate(Magnitude_index = row_number(),
         var2 = if_else(Magnitude_index <= n() * 0.25, 0.3, var2)
         ) %>%
  arrange(Row) %>%
  select(any_of(names(df)))

  ID var1 var2 var3
1  1    a  1.0   50
2  2    b  1.0   40
3  3    c  0.0   30
4  4    d  0.0   45
5  5    e  1.0   33
6  5    f  0.3   51
7  7    g  0.3   70
8  8    h  0.0   46
zzoitvuj

zzoitvuj3#

下面是一个解决方案,按var3对 Dataframe 进行排序,并检查row_number是否等于或小于总行数的25%:

df %>% arrange(desc(var3)) %>% mutate(var2 = ifelse(row_number() <= 0.25*nrow(df), 0.3, var2)) %>% arrange(ID)

输出:

ID var1 var2 var3
1  1    a  1.0   50
2  2    b  1.0   40
3  3    c  0.0   30
4  4    d  0.0   45
5  5    f  0.3   51
6  5    e  1.0   33
7  7    g  0.3   70
8  8    h  0.0   46

相关问题