矩阵转换-shell版

使用shell完成矩阵转换:
file.txt中的内容为以下:

name age
alice 21
ryan 30
转化后:
name alice ryan
age 21 30
awk '{ #这个大括号里的代码是 对正文的处理
    # NF表示列数,NR表示已读的行数
    # 注意for中的i从1开始,i前没有类型
    for (i=1; i<=NF; i++){#对每一列
        if(NR==1){       #如果是第一行
            #将第i列的值存入res[i],$i表示第i列的值,i为数组的下标,以列序号为下标,
            #数组不用定义可以直接使用
            res[i]=$i;   
        }
        else{
            #不是第一行时,将该行对应i列的值拼接到res[i]
            res[i]=res[i] " " $i
        }
    }
}
# BEGIN{} 文件进行扫描前要执行的操作;END{} 文件扫描结束后要执行的操作。
END{
    #输出数组
	for (i=1; i<=NF; i++){
		print res[i]
	}
}' file.txt
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,根据您的要求,可以使用Spark来实现对sku_id进行one-hot转换,并将结果聚合成矩阵形式。假设原始数据集的变量名为 `df`,其中包含了 `user_id` 和 `sku_id` 两列信息,可以按照如下方式进行处理: ```scala import org.apache.spark.ml.feature.{OneHotEncoder, StringIndexer} // 将 sku_id 转换为索引 val indexer = new StringIndexer() .setInputCol("sku_id") .setOutputCol("sku_index") .fit(df) val indexed = indexer.transform(df) // 对 sku_index 进行 one-hot 编码 val encoder = new OneHotEncoder() .setInputCol("sku_index") .setOutputCol("sku_vec") .setDropLast(false) val encoded = encoder.transform(indexed) // 按照 user_id 进行聚合 val matrix = encoded .groupBy("user_id") .pivot("sku_id") .agg(sum("sku_vec")) .na.fill(0) .orderBy("user_id") // 展示矩阵第一行前5列数据 matrix.select("user_id", matrix.columns.slice(2, 7): _*).show() ``` 其中,`OneHotEncoder` 和 `StringIndexer` 是Spark中用来进行one-hot编码和索引转换的工具类。首先,使用 `StringIndexer` 将 `sku_id` 转换为整数索引,并创建一个新的列 `sku_index`。然后,使用 `OneHotEncoder` 对 `sku_index` 进行one-hot编码,并创建一个新的列 `sku_vec`。最后,按照 `user_id` 进行聚合,并使用 `pivot` 将 `sku_id` 转换为列名。由于在转换过程中可能会出现缺失值,所以需要使用 `na.fill(0)` 将缺失值填充为0。最后,使用 `orderBy` 对结果按照 `user_id` 进行升序排序,然后选择第一行前5列数据进行展示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值