Как мне суммировать значения по фрейму данных в R? - PullRequest
1 голос
/ 09 апреля 2020

Я просмотрел несколько форумов, пытаясь найти ответ, который мне подходит, но не повезло. Я, наверное, слишком обдумываю это, но что-то помогает!

У меня есть фрейм данных о процентном покрытии растительности по ряду участков (участки, перечисленные в столбцах с каждым видом в строке). Я хотел бы создать новый столбец, который подсчитывает количество сайтов, в которых присутствовал каждый вид. Например, на скольких сайтах процентное покрытие Salix превышает 0?

Вот небольшой кадр данных для работать сейчас ... (сайты и виды - это имена столбцов и строк соответственно)

           site1     site2      site3      site4
Salix      16.50      7.00       7.50       6.00 
Betula     17.75     19.75       0.00       5.25
Alnus       0.00      0.00       0.00       0.00
Picea       0.00      0.35       0.00       0.00

Я бы хотел, чтобы последний столбец выглядел следующим образом:

           site1     site2      site3      site4     count
Salix      16.50      7.00       7.50       6.00         4
Betula     17.75     19.75       0.00       5.25         3
Alnus       0.00      0.00       0.00       0.00         0
Picea       0.00      0.35       0.00       0.00         1

Я получил функцию подсчета для работы по одной строке за раз, но у меня возникают проблемы с автоматизацией этого для всего фрейма данных (намного больше, чем тот, который я показываю здесь).

sum(df[1, ] > 0)
[1] 4

sum(df[2, ] > 0)
[1] 3

Я попытался для l oop вот так:

#First I created an empty column
df$count <- NA

#Then I tried to populate that column
for(i in 1:nrow(df)){
  df$count <- sum(df[i, 1:ncol(df) - 1] > 0)

Error in df$count[i, ] <- sum(df[i, 1:ncol(df) - 1] > 0) : 
  incorrect number of subscripts on matrix

Я также кратко попытался поработать с функцией apply:

df$count <- lapply(df, MARGIN = 1, FUN = function(x) sum(x > 0))
Error in FUN(X[[i]], ...) : unused argument (MARGIN = 1)

Когда я пытаюсь удалить аргумент MARGIN, я получаю сообщение об ошибке, которое сбивает с толку столбцы со строками (эта ошибка связана с моими фактическими данными, которые составляют 79 столбцов на 38 строк):

Error in `$<-.data.frame`(`*tmp*`, sites, value = list(`site1` = 15L,  : 
  replacement has 79 rows, data has 38

Любое руководство?

1 Ответ

1 голос
/ 09 апреля 2020

с apply:

df$count <- apply(df,1,function(x){sum(x>0)})

с rowSums:

df$count <- rowSums(df>0)

результат:

       site1 site2 site3 site4 count
Salix  16.50  7.00   7.5  6.00     4
Betula 17.75 19.75   0.0  5.25     3
Alnus   0.00  0.00   0.0  0.00     0
Picea   0.00  0.35   0.0  0.00     1

данные:

df <- read.table(text = "           site1     site2      site3      site4
Salix      16.50      7.00       7.50       6.00 
Betula     17.75     19.75       0.00       5.25
Alnus       0.00      0.00       0.00       0.00
Picea       0.00      0.35       0.00       0.00")
...