根据if语句重复R中的单元格值
Repeat the cell value in R based on if statement
我有如下代码,取自 and 。我想重复因子单元格值 gear1.3, gear1.4 gear1.5
与列号一样长。非常感谢。
mtcars$gear1 <- factor(mtcars$gear, levels = c(3,4,5))
my.stats <- function(x){
if(is.numeric(x)){
funs <- c(mean, median, sd, mad, IQR)
lapply(funs, function(f) f(x, na.rm = T))
} else {prop.table(table(x))
}}
lapply(mtcars, FUN = my.stats)
unlist(lapply(mtcars, FUN = my.stats))
as.data.frame(unlist(lapply(mtcars, FUN = my.stats)))
setNames(as.data.frame(unlist(lapply(mtcars, FUN = my.stats))), c("mean", "median", "sd", "mad", "IQR"))
预期答案
mean median sd mad IQR
X1 mean(X1)
X2 mean(X2)
X3
X4
X5
X6
gear1.3 prop.table(gear1.3) prop.table(gear1.3) .....REPEAT
gear1.3 prop.table(gear1.4) prop.table(gear1.4) .....REPEAT
gear1.5 prop.table(gear1.5) prop.table(gear1.5) .....REPEAT
您可以将函数更改为:
my.stats <- function(x){
if(is.numeric(x)){
data.frame(mean = mean(x, na.rm = TRUE), median = median(x, na.rm = TRUE),
sd = sd(x, na.rm = TRUE), mad = mad(x, na.rm = TRUE),
IQR = IQR(x, na.rm = TRUE))
} else {
do.call(rbind, lapply(prop.table(table(x)), function(p) {
data.frame(mean = p, median = p, sd = p, mad = p, IQR = p)
}))
}
}
do.call(rbind, lapply(mtcars, my.stats))
# mean median sd mad IQR
#mpg 20.090625 19.20000 6.0269481 5.4114900 7.37500
#cyl 6.187500 6.00000 1.7859216 2.9652000 4.00000
#disp 230.721875 196.30000 123.9386938 140.4763500 205.17500
#hp 146.687500 123.00000 68.5628685 77.0952000 83.50000
#drat 3.596563 3.69500 0.5346787 0.7042350 0.84000
#wt 3.217250 3.32500 0.9784574 0.7672455 1.02875
#qsec 17.848750 17.71000 1.7869432 1.4158830 2.00750
#vs 0.437500 0.00000 0.5040161 0.0000000 1.00000
#am 0.406250 0.00000 0.4989909 0.0000000 1.00000
#gear 3.687500 4.00000 0.7378041 1.4826000 1.00000
#carb 2.812500 2.00000 1.6152000 1.4826000 2.00000
#gear1.3 0.468750 0.46875 0.4687500 0.4687500 0.46875
#gear1.4 0.375000 0.37500 0.3750000 0.3750000 0.37500
#gear1.5 0.156250 0.15625 0.1562500 0.1562500 0.15625
我有如下代码,取自gear1.3, gear1.4 gear1.5
与列号一样长。非常感谢。
mtcars$gear1 <- factor(mtcars$gear, levels = c(3,4,5))
my.stats <- function(x){
if(is.numeric(x)){
funs <- c(mean, median, sd, mad, IQR)
lapply(funs, function(f) f(x, na.rm = T))
} else {prop.table(table(x))
}}
lapply(mtcars, FUN = my.stats)
unlist(lapply(mtcars, FUN = my.stats))
as.data.frame(unlist(lapply(mtcars, FUN = my.stats)))
setNames(as.data.frame(unlist(lapply(mtcars, FUN = my.stats))), c("mean", "median", "sd", "mad", "IQR"))
预期答案
mean median sd mad IQR
X1 mean(X1)
X2 mean(X2)
X3
X4
X5
X6
gear1.3 prop.table(gear1.3) prop.table(gear1.3) .....REPEAT
gear1.3 prop.table(gear1.4) prop.table(gear1.4) .....REPEAT
gear1.5 prop.table(gear1.5) prop.table(gear1.5) .....REPEAT
您可以将函数更改为:
my.stats <- function(x){
if(is.numeric(x)){
data.frame(mean = mean(x, na.rm = TRUE), median = median(x, na.rm = TRUE),
sd = sd(x, na.rm = TRUE), mad = mad(x, na.rm = TRUE),
IQR = IQR(x, na.rm = TRUE))
} else {
do.call(rbind, lapply(prop.table(table(x)), function(p) {
data.frame(mean = p, median = p, sd = p, mad = p, IQR = p)
}))
}
}
do.call(rbind, lapply(mtcars, my.stats))
# mean median sd mad IQR
#mpg 20.090625 19.20000 6.0269481 5.4114900 7.37500
#cyl 6.187500 6.00000 1.7859216 2.9652000 4.00000
#disp 230.721875 196.30000 123.9386938 140.4763500 205.17500
#hp 146.687500 123.00000 68.5628685 77.0952000 83.50000
#drat 3.596563 3.69500 0.5346787 0.7042350 0.84000
#wt 3.217250 3.32500 0.9784574 0.7672455 1.02875
#qsec 17.848750 17.71000 1.7869432 1.4158830 2.00750
#vs 0.437500 0.00000 0.5040161 0.0000000 1.00000
#am 0.406250 0.00000 0.4989909 0.0000000 1.00000
#gear 3.687500 4.00000 0.7378041 1.4826000 1.00000
#carb 2.812500 2.00000 1.6152000 1.4826000 2.00000
#gear1.3 0.468750 0.46875 0.4687500 0.4687500 0.46875
#gear1.4 0.375000 0.37500 0.3750000 0.3750000 0.37500
#gear1.5 0.156250 0.15625 0.1562500 0.1562500 0.15625