добавить значения столбца в другой столбец

#r #unix #append

#r #unix #добавить

Вопрос:

У меня есть текстовый файл с разделителями табуляции следующим образом:

 1 aaa apple
1 bbb banana
3 ccc grape
5 ddd orange
  

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

 1 aaa 1_apple
1 bbb 1_banana
3 ccc 3_grape
5 ddd 5_orange
  

У меня нет предпочтений в языке программирования, но R и Unix были бы лучше, если это возможно…

Спасибо

Комментарии:

1.Посмотрите на tidyr unite или paste0 . Каковы заголовки этих столбцов (если таковые имеются)?

Ответ №1:

Если вы хотите использовать bash , вы можете попробовать:

 $ awk '{print $1, $2, $1"_"$3}' file.txt > file2.txt
$ cat file2.txt
1 aaa 1_apple
1 bbb 1_banana
3 ccc 3_grape
5 ddd 5_orange
  

Если вы хотите сделать в R , то попробуйте приведенный ниже код R:

 a <- read_table("file.txt", col_names = FALSE)
a$X3 <- paste(a$X1, a$X3, sep = "_")
write_delim(a, "file2.txt", col_names = FALSE)
  

Файл должен выглядеть как:

 $ cat file2.txt
1 aaa 1_apple
1 bbb 1_banana
3 ccc 3_grape
5 ddd 5_orange
  

Ответ №2:

 df$NewColumn<-paste0(df[,1],"_",df[,ncol(df)])
df
V1  V2     V3 NewColumn
1  1 aaa  apple   1_apple
2  1 bbb banana  1_banana
3  3 ccc  grape   3_grape
4  5 ddd orange  5_orange
  

Запись в .txt

 write.table(tidyr::unite(df,New_col,"V1","V3"),"test.txt")
  

С tidyr :

 tidyr::unite(df,New_col,"V1","V3")
  

Данные:

 df<-read.table(text="1 aaa apple
1 bbb banana
3 ccc grape
5 ddd orange")
  

Ответ №3:

С помощью R мы можем попробовать использовать read.csv и write.csv , немного манипулируя строками:

 df <- read.csv(file="path/to/your/file.txt")   # one column for entire value
lines <- sapply(df[,1], function(x) {
    parts <- strsplit(x, " ")[[1]]
    parts[3] <- paste0(parts[1], "_", parts[3])
    return(paste0(parts, collapse=" "))
})
write.csv(rbind(lines), file="path/to/your/output.txt")