我有一個聽起來很容易的問題,但是我在R中找不到解決方案。我想根據發布的第一年來轉移數值。我的意思是,第一列代表發布的年份,第二列是設備損壞的年份(數值是損壞設備的數字)。
這是在Python中的一個解決方案:
def f(x):
shifted = np.argmin((x. index.astype(int)<x. name[0]))
return x.shift(-shifted)
df = df. set_index(['Delivery Year', 'Freq'])。 apply(f, axis=1)
df.columns = [f'year. {i 1}' for i in range(len(df. columns))]。
df = df.reset_index()
df
我也想在R語言中擁有它。
# TEST
data <- data.frame()
= c('1976'>, '1977'。 '1978','1979'),
`Freq` = c(120。 100。 80,60) ,
`年份.1976 `= c(10。 NA。 NA,NA),
`年.1977 `= c(5。 3。 NA,NA),,
`年份.1978 `= c(10。 NA。 8,NA),
`年份.1979 `= c(13。 10,5, 14)
)
資料
# DESIRED
資料 <- data.frame()
= c('1976'>, '1977'。 '1978','1979'),
`Freq` = c(120。 100。 80,60) ,
`年.1 `= c(10。 3。 8,14) ,
`年.2 `= c(5。 NA。 5,NA),
`年.3 `= c(10。 10。 NA,NA),,
`年.4 `= c(13。 NA,NA,NA)
)
資料
此外,是否也可以將破損設備的數量轉化為Freq欄的百分比?
謝謝你
uj5u.com熱心網友回復:
library(dplyr)
f <- function(df) {>
years <- paste0("年。 ",sort(as.vector(na.省略(as. integer(stringr:: str_extract(colnames(df)。 "d "))))))
df1 <- df %>% select(years)
df2 <- df %>% select(-years)
val <- c()
第一年<-年[/span>1]
for (k in 1: nrow(df1) ) {
vec <- as.numeric(as. vector(df1[k, ]))
val[k] <- (as。 numeric(suppressWarnings(na. 省略(vec)))。 標點符號">))[1]
}
df1[firstyear] <- val
colnames(df1) < - c(paste0("年。 ",seq(1。 ncol(df1))))
df <- cbind(df2,df1)
print(df)
}
> f(data)
交付量.年份 頻率 Year.1 Year.2 Year.3 Year.4
1 1976 120 10 5 10 13
2 1977 100 3 3 NA 10
3 1978 80 8 NA 8 5
4 1979 60 14 NA NA 14 14
uj5u.com熱心網友回復:
使用tidyverse
data %>%
pivot_longer(!c(Delivery. 年份,頻率)) %>%
separate(name, c("Lab"。 "Year") %> %
select(-Lab) %> %
mutate_all(as.numeric) %>%
filter(Year >= Delivery.Year) %>%
group_by(Delivery.Year, Freq) %>%
mutate(ind = paste0("年。 ", row_number()),
per = value/Freq) %>%
ungroup() %>%
pivot_wider(id_cols = c(Delivery. 年份,頻率), names_from = ind。 values_from = c(value, 每))
我把它轉為長格式開始,并把原來的列名Year.1976、Year.1977等分開,只從列中獲取年份,并把其中的Year這塊去掉。然后,我將所有的列轉換為數字,以便進行數學運算,如過濾Year >=Delivery.Year時。然后,我創建了一個列來獲得你所要求的標題Year.1,Year.2,等等,并計算出百分比。然后我pivot_wider以獲得你要求的格式。有一點需要注意的是,我不清楚你是想要原始值和百分比還是只想要百分比。如果你只想要百分比,那么values_from = per應該為你做到。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/332232.html
標籤:

