因此,從本質上講,我是R的新手,我的弱點是盡量少寫代碼。 我總是遇到同樣的問題,但我似乎無法用回圈或函式來解決它,所以我希望得到一些幫助。
假設我的df看起來像這樣:
a = c(12。 9, 11。 17, 22)
b = c(8。 1。 9, 4, 15)
c = c(2。 4。 1, 8, 4)
d = c(2。 4。 1, 5, 3)
df = data. frame(a,b。 c, d)
我想計算b、c和d占a的比例,我想為每個結果建立一個新列。 我的代碼不含函式等,看起來像這樣:
df$c_p = round((df$c / df$a)*100。 數字= 2)
df$d_p = round((df$d / df$a)*100。 數字 = 2)
有什么最簡單的方法可以獲得與我相同的輸出,而不需要一遍又一遍地復制代碼?我的資料框架在現實中要大得多,現在是時候讓我學習如何更有效地做這件事了。
謝謝你!
uj5u.com熱心網友回復:
你可以利用R的矢量化。
cols < - names(df)/span>[-1]
#OR
#cols <- c('b', 'c', 'd')
df[paste0(cols。 '_p')] < - round(df[cols] operator">/df$a * 100。 2)
df
# a b c d b_p c_p d_p
#1 10 8 2 2 80.00 20.0 20.0
#2 23 1 4 4 4.35 17.4 17.4
#3 50 9 1 1 18.00 2.0 2.0
#4 7 4 8 5 57.14 114.3 71.4
#5 3 15 4 3 500.00 133.3 100.0
uj5u.com熱心網友回復:
另一種(和優雅的)解決方案是基于dplyr的:
library(dplyr)
df %>%
mutate(across(b:d),. /a*100) %>%。
select(-a)
b c d
1 66.66667 16.666667 16.666667
2 11.11111 44.444444 44.4444
3 81.81818 9.090909[/span> 9.090909[/span
4 23.52941 47.058824 29.411765[/span]。
5 68.18182 18.1818 13.636364
或者,四舍五入后:
df %>%
mutate(across(b: d), round(. /a*100。 2)) %> %
選擇(-a)
編輯:
為了保持原來的列,使用cbind:
df %>%。
mutate(across(b: d), round(. /a*100。 2)) %> %
重命名(b_p = b, c_p = c。 d_p = d) %> %
select(-a) %> %
cbind(df, .)
a b c d b_p c_p d_p
1 12 8 2 2 66. 67 16.67 16.67
2 9 1 4 4 11。 11 44.44 44.44 11.
3 11 9 1 1 81. 82 9.09 9.09 9.
4 17 4 8 5 23。 53 47.06 29.41
5 22 15 4 3 68。 18 18.18 13.64
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/306856.html
標籤:
