我有一个格式为
的大型排序数据文件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变量但是如何遍历第二列
答案 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
表示一个真实的条件,默认操作是打印当前行,因此打印所有行。