Grep变量并循环到下一列

时间:2016-04-12 07:42:10

标签: r bash

我有一个格式为

的大型排序数据文件
car 54.9

car 33.2

car 29.7

Bike 96.1

Bike 94.6

Bike 80

我希望小数值与第一个值相比,即每个变量(汽车和自行车)将第二列中的数字除以该变量的最大数字。 期望的输出

car 1

car 0.6

car 0.54

Bike 1

Bike 0.98

Bike 0.83

我可以grep变量但是如何遍历第二列

2 个答案:

答案 0 :(得分:3)

R中,我们可以使用data.table(从read.table/read.csv读取数据集或从fread读取data.table)。将'data.frame'转换为'data.table'(setDT(df1)),按'Col1'分组,我们将'Col2'除以'Col2'的最大值并赋值(:=)它回到'Col2'。

library(data.table)
setDT(df1)[, Col2 := round(Col2/max(Col2), 2) , by = Col1]
df1
#   Col1    Col2
#1:  car    1.00
#2:  car    0.60
#3:  car    0.54
#4: Bike    1.00
#5: Bike    0.98
#6: Bike    0.83

数据

df1 <- structure(list(Col1 = c("car", "car", "car", "Bike", "Bike", 
"Bike"), Col2 = c(54.9, 33.2, 29.7, 96.1, 94.6, 80)), .Names = c("Col1", 
"Col2"), class = "data.frame", row.names = c(NA, -6L))

答案 1 :(得分:3)

使用awk你可以这样:

$ awk '$1!=l{l=$1;m=$2}{$2/=m}1' file
car 1
car 0.604736
car 0.540984
Bike 1
Bike 0.984391
Bike 0.832466

这要求文件首先按列$ 1排序,然后按列$ 2排序。

这是如何运作的?输入文件逐行扫描。第一项$1!=l{l=$1;m=$2}过滤第一个单词等于变量l的行。如果找不到它们(这将发生在块的第一行),则第一个字存储在行l中(这样我们就可以识别下一个块开始的位置。第二个字存储在变量中) m。由于这是块的第一行,并且文件已排序,因此这是块的最大值。

对所有行执行下一个术语{$2/=m}(因为它不包含过滤器),并将第二个单词替换为单词除以max(存储在变量m中)

最后一个块1表示一个真实的条件,默认操作是打印当前行,因此打印所有行。