我正在做一个作业问题,我们创建一个4列10行的数据框,然后创建一个处理该数据框的函数。
问题指出: 在R中编写一个称为“ transform”的函数,该函数可以执行以下操作: 按以下顺序接受四个参数(无默认值): df:数据框。 a:表示所选行号的整数。 b:整数,指示第二个/不同的选定行号。 varName:df中任何变量的名称。
该功能应: 确保a和b是有效的行号。 如果它们有效,则函数应将所选变量中的值插入行号“ a”和行号“ b”。
代码必须是单个函数。
代码也应适用于具有不同列名的数据框。
transform <- function(df, a, b, varName){
if(a > nrow(df) | b > nrow(df)){
print('Invalid row numbers specified')
}
if(a < 1 | b < 1){
print('Invalid row numbers specified')
}
v <- varName
c <- which(colnames(df) == v)
if(c == 1){
x <- df[a, 1]
y <- df[b, 1]
df[a, 1] <- y
df[b, 1] <- x
}
if(c == 2){
x <- df[a, 2]
y <- df[b, 2]
df[a, 2] <- y
df[b, 2] <- x
}
if(c == 3){
x <- df[a, 3]
y <- df[b, 3]
df[a, 3] <- y
df[b, 3] <- x
}
if(c == 4){
x <- df[a, 4]
y <- df[b, 4]
df[a, 4] <- y
df[b, 4] <- x
}
}
预期结果:
Num <- c(1:10)
Age <- c(14,12,15,10,23,21,41,56,78,12)
Sex <- c('F','M','M','F','M','F','M','M','F','M')
Group <- letters[1:10]
datfr <- data.frame(Num, Age, Sex, Group)
datfr <- transform(datfr,1,3,"Group")
datfr <- transform(datfr,7,2,"Group")
datfr <- transform(datfr,5,10,"Group")
datfr <- transform(datfr,5,11,"Group")
[1] "ERROR: Invalid row numbers specified"
datfr
Num Age Sex Group
1 1 14 F c
2 2 12 M g
3 3 15 M a
4 4 10 F d
5 5 23 M j
6 6 21 F f
7 7 41 M b
8 8 56 M h
9 9 78 F i
10 10 12 M e
实际结果:
Num <- c(1:10)
Age <- c(14,12,15,10,23,21,41,56,78,12)
Sex <- c('F','M','M','F','M','F','M','M','F','M')
Group <- letters[1:10]
datfr <- data.frame(Num, Age, Sex, Group)
datfr <- transform(datfr, 1, 3, "Group")
datfr <- transform(datfr, 7, 2, "Group")
Error in if (a > nrow(df) | b > nrow(df)) { : argument is of length zero
datfr <- transform(datfr, 5, 10, "Group")
Error in if (a > nrow(df) | b > nrow(df)) { : argument is of length zero
datfr <- transform(datfr, 5, 11, "Group")
Error in if (a > nrow(df) | b > nrow(df)) { : argument is of length zero
datfr
[1] a
Levels: a b c d e f g h i j
答案 0 :(得分:0)
请考虑使用提取运算符(列的[[
和行号的[
)来指定数据帧中的精确位置,然后使用赋值<-
的运算符来转换新值。
my_transform <- function(df, a, b, varName){
# CHECK VALIDITY OF PARAMS
if(a > nrow(df) | b > nrow(df) | a < 1 | b < 1 | !(varName %in% colnames(df))){
print('Invalid var name or row numbers specified')
}
else {
# SELECT COLUMN AND ROW AND ASSIGN
df[[varName]][a] <- df[[varName]][b]
}
return(df)
}
New_Data <- my_transform(Original_Data, 1, 5, "myColumnName")
在旁边-如果决定保留名称 transform ,则为了调用原始的基本R函数,请使用双冒号运算符::
添加其程序包别名。但是为了获得最佳实践,请始终避免这些命名空间冲突:
# ADD A NEW COLUMN WITH SPECIFIED VALUE
New_Data <- base::transform(Original_Data, new_column = 1)
答案 1 :(得分:0)
transform <- function(df, a, b, varName){
if(a > nrow(df) | b > nrow(df) | a < 1 | b < 1 | !(varName %in% colnames(df))){ # Parameter validity check
print('Invalid column name or row numbers specified')
}
else { # select column and row and assign
x <- df[[varName]][a] # [[ gets column number and [ gets row number
y <- df[[varName]][b]
df[[varName]][a] = y
df[[varName]][b] = x
}
return(df) }