交换数据框中的指定行

时间:2019-03-26 13:53:21

标签: r

我正在做一个作业问题,我们创建一个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

2 个答案:

答案 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)  }