Замена указанных строк в кадре данных - PullRequest
1 голос
/ 26 марта 2019

Я делаю домашнее задание, в котором мы создаем фрейм данных с 4 столбцами и 10 строками, а затем создаем функцию для работы с фреймом данных.

Проблема состоит в следующем: написать одну функцию в R, называемую «transform», которая выполняет следующие действия: принимает четыре аргумента (без значений по умолчанию) в следующем порядке: df: информационный кадр.а: целое число, обозначающее выбранный номер строки.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 голосов
/ 27 марта 2019
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)  }
0 голосов
/ 26 марта 2019

Рекомендуется использовать операторы извлечения ([[ для столбца и [ для номера строки), чтобы указать точное местоположение во фрейме данных, а затем преобразовать новые значения с помощью оператора присваивания <-.

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...